GNU Emacs Lisp Reference Manual

For Emacs Version 24.5

Revision 3.1, October 2014

by Bil Lewis, Dan LaLiberte, Richard Stallman,
the GNU Manual Group, et al.

This is the GNU Emacs Lisp Reference Manual corresponding to Emacs version 24.5.

Copyright © 1990–1996, 1998–2015 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being “GNU General Public License,” with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”

(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.”



Published by the Free Software Foundation
51 Franklin St, Fifth Floor
Boston, MA 02110-1301
USA
ISBN 1-882114-74-4



Cover art by Etienne Suvasa.


[ < ] [ > ]   [Contents] [Index] [ ? ]

Emacs Lisp

This is the GNU Emacs Lisp Reference Manual corresponding to Emacs version 24.5.

Copyright © 1990–1996, 1998–2015 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being “GNU General Public License,” with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”

(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.”


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1 Introduction

GNU Emacsテキストエディターのほとんどの部分は、Emacs Lispと呼ばれるプログラミング言語で記述されています。新しいコードをEmacs Lispで記述して、このエディターの拡張としてインストールできます。しかしEmacs Lispは、単なる“拡張言語”を越えた言語であり、それ自体で完全なコンピュータープログラミング言語です。他のプログラミング言語で行なうすべてのことに、この言語を使用できます。

Emacs Lispはエディターの中で使用するようにデザインされているので、テキストのスキャンやパースのための特別な機能をもち、同様にファイル、バッファー、ディスプレー、サブプロセスを処理する機能をもちます。Emacs Lispは編集機能と密に統合されています。したがって編集コマンドはLispプログラムから簡単に呼び出せる関数であり、カスタマイズのためのパラメーターは普通のLisp変数です。

このマニュアルはEmacs Lispの完全な記述を試みます。初心者のためのEmacs Lispのイントロダクションは、Free Software Foundationからも出版されている、Bob ChassellのAn Introduction to Emacs Lisp Programmingを参照してください。このマニュアルは、Emacsを使用した編集に熟知していることを前提としています。これの基本的な情報については、The GNU Emacs Manualを参照してください。

おおまかに言うと、前の方のチャプターでは多くのプログラミング言語に対応するEmacs Lispの機能について説明し、後のチャプターではEmacs Lispに特異な機能や、特に編集に関連した機能を説明します。

これは Emacs 24.5に対応したGNU Emacs Lisp Reference Manualです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.1 Caveats

このマニュアルは幾多のドラフトを経てきました。ほとんど完璧ではありますが、不備がないとも言えません。(ほとんどの特定のモードのように)それらが副次的であるとか、まだ記述されていないという理由により、カバーされていないトピックもあります。わたしたちがそれらを完璧に扱うことはできないので、いくつかの部分は意図的に省略しました。

このマニュアルは、それがカバーしている事柄については完全に正しくあるべきあり、故に、特定の説明テキスト、チャプターやセクションの順番にたいしての批判に開かれているべきです。判りにくかったり、このマニュアルでカバーされていない何かを学ぶためにソースを見たり実験から学ぶ必要があるなら、このマニュアルはおそらくフィクスされるべきなのかもしれません。わたしたちにそれを教えてください。

このマニュアルを使用するときは、間違いを見つけたらすぐに訂正を送ってください。関数または間数グループの単純な現実例を考えたときは、ぜひそれを記述して送ってください。それが妥当ならコメントでノード名と関数名や変数名を参照してください。あなたが訂正を求めるエディションのバージョンも示してください。

M-x report-emacs-bugを使用してコメントや訂正を送ってください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2 Lisp History

Lisp(LISt Processing language: リスト処理言語)は、MIT(Massachusetts Institute of Technology: マサチューセッツ工科大学)で、AI(artificial intelligence: 人工知能)の研究のために、1950年代末に最初に開発されました。Lisp言語の強力なパワーは、編集コマンドの記述のような、他の目的にも適っています。

長年の間に何ダースものLisp実装が構築されてきて、それぞれ特異な点があります。これらの多くは、1960年代にMITのProject MACで記述された、Maclispに影響を受けています。最終的に、Maclisp後裔の実装者は共同して、Common Lispと呼ばれる標準のLispシステムを開発しました。その間に、MITのGerry SussmanとGuy Steeleにより、簡潔だがとても強力なLisp方言である、Schemeが開発されました。

GNU Emacs LispはMaclispから多く、Common Lispから少し影響を受けています。Common Lispを知っている場合、多くの類似点に気がつくでしょう。しかしCommon Lispの多くの機能は、GNU Emacsが要求するメモリー量を削減するために、省略されるか単純化されています。ときには劇的に単純化がされているために、Common Lispユーザーは混乱するかもしれません。わたしたちは時折GNU Emacs LispがCommon Lispと異なるか示すでしょう。Common Lispを知らない場合、それについて心配する必要はありません。このマニュアルは自己完結しています。

cl-libライブラリーを通じて、Common Lispをかなりエミュレートできます。Overview in Common Lisp Extensionsを参照してください。

Emacs LispはSchemeの影響は受けていません。しかしGNUプロジェクトにはGuileと呼ばれるScheme実装があります。拡張が必要な新しいGNUソフトウェアーでは、Guileを使用します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3 Conventions

このセクションでは、このマニュアルで使用する表記規約を説明します。あなたはこのセクションはスキップして、後で参照したいと思うかもしれません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.1 Some Terms

このマニュアルでは、“Lispリーダー”および“Lispプリンター”という用語で、Lispのテキスト表現を実際のLispオブジェクトに変換したり、その逆を行なうLispルーチンを参照します。詳細については、Printed Representation and Read Syntaxを参照してください。あなた、つまりこのマニュアルを読んでいる人のことは“プログラマー”と考えて“あなた”と呼びます。“ユーザー”とは、あなたの記述したものも含めて、Lispプログラムを使用する人を指します。

Lispコードの例は、(list 1 2 3)のようなフォーマットです。 Examples of Lisp code are formatted like this: (list 1 2 3). メタ構文変数(metasyntactic variables)を表す名前や、説明されている関数の引数名前は、first-numberのような形式です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.2 nil and t

Emacs Lispでは、シンボルnilには3つの異なる意味があります。1つ目は‘nil’という名前のシンボル、2つ目は論理値のfalse、3つ目は空リスト — つまり要素が0のリストです。変数として使用した場合、nilは常に値nilをもちます。

Lispリーダーに関する限り、‘()’と‘nil’は同一です。これらは同じオブジェクト、つまりシンボルnilを意味します。このシンボルを異なる方法で記述するのは、完全に人間の読み手を意図したものです。Lispリーダーが‘()’か‘nil’のどちらかを読み取った後は、プログラマーが実際にどちらの表現で記述したかを判断する方法はありません。

このマニュアルでは、空リストを意味することを強調したいときは()と記述し、論理値のfalseを意味することを強調したいときはnilと記述します。この慣習はLispプログラムで使用してもよいでしょう。

(cons 'foo ())                ; 空リストを強調します
(setq foo-flag nil)           ; 論理値のfalseを強調します

論理値が期待されているコンテキストでは、非niltrueと判断されます。しかし論理値のtrueを表す好ましい方法はtです。trueを表す値を選択する必要があり、他に選択の根拠がない場合は、tを使用してください。シンボルtは、常に値tをもちます。

Emacs Lispでは、niltは、常に自分自身を評価する、特別なシンボルです。そのためプログラムでこれらを定数として使用する場合、クォートする必要はありません。これらの値を変更使用と試みると、結果はsetting-constantエラーとなります。Variables that Never Changeを参照してください。

Function: booleanp object

objectが、2つのカノニカルなブーリーン値(tまたはnil)の場合は、非nilをリターンします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.3 Evaluation Notation

評価することができるLisp式のことを、フォーム(form)と呼びます。フォームの評価により、常に結果としてLispオブジェクトが生成されます。このマニュアルの例では、これを‘’で示します:

(car '(1 2))
     ⇒ 1

これは、“(car '(1 2))を評価すると1になる”と読むことができます。

フォームがマクロ呼び出しの場合、それは評価されるための新しいLispのフォームに展開されます。展開された結果は‘’で示します。展開されたフォームを評価した結果を示すこともあれば、示さない場合もあります。

(third '(a b c))
     → (car (cdr (cdr '(a b c))))
     ⇒ c

1つのフォームを説明するために、同じ結果を生成する別のフォームを示すこともあります。完全に等価な2つのフォームは、‘’で示します。

(make-sparse-keymap) ≡ (list 'keymap)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.4 Printing Notation

このマニュアルの例の多くは、それらが評価されるときにテキストをプリントします。(*scratch*バッファーのような)Lisp Interactionバッファーでコード例を実行する場合、プリントされるテキストはそのバッファーに挿入されます。(関数eval-regionで評価するなど)他の方法でコード例を実行する場合、プリントされるテキストはエコーエリアに表示されます。

このマニュアルの例はプリントされるテキストがどこに出力されるかに関わらず、それを‘-|’で示します。フォームを評価することにより戻される値は、‘’とともに後続の行で示します。

(progn (prin1 'foo) (princ "\n") (prin1 'bar))
     -| foo
     -| bar
     ⇒ bar

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.5 Error Messages

エラーをシグナルする例も、いくつかあります。これは通常、エコーエリアにエラーメッセージを表示します。エラーメッセージの行は、‘error→’で始まります。‘error→’自体は、エコーエリアに表示されないことに注意してください。

(+ 23 'x)
error→ Wrong type argument: number-or-marker-p, x

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.6 Buffer Text Notation

バッファー内容の変更を説明する例もあり、それらの例ではテキストの“before(以前)”と“after(以後)”のバージョンを示します。それらの例では、バッファー内容の該当する部分を、ダッシュを用いた2行の破線(バッファー名を含む)で示します。さらに、‘’はポイントの位置を示します(もちろんポイントのシンボルは、バッファーのテキストの一部ではなく、それはポイントが現在配されている2つの文字のの位置を示します)。

---------- Buffer: foo ----------
This is the ∗contents of foo.
---------- Buffer: foo ----------

(insert "changed ")
     ⇒ nil
---------- Buffer: foo ----------
This is the changed ∗contents of foo.
---------- Buffer: foo ----------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.7 Format of Descriptions

このマニュアルでは関数(function)、変数(variable)、コマンド(command)、ユーザーオプション(user option)、スペシャルフォーム(special form)を、統一されたフォーマットで記述します。記述の最初の行には、そのアイテムの名前と、もしあれば引数(argument)が続きます。 そのアイテムの属するカテゴリー(function、variableなど)は、行の先頭に表示します。 それ以降の行は説明行で、例を含む場合もあります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.7.1 A Sample Function Description

関数の記述では、関数の名前が最初に記述されます。同じ行に引数の名前のリストが続きます。引数の値を参照するために、引数の名前は記述の本文にも使用されます。

引数リストの中にキーワード&optionalがある場合、その後の引数が省略可能であることを示します(省略された引数のデフォルトはnilです)。その関数を呼び出すときは、&optionalを記述しないでください。

キーワード&rest(これの後には1つの引数名を続けなければなりません)は、その後に任意の引数を続けることができることを表します。&restの後に記述された引数名の値には、その関数に渡された残りのすべての引数がリストとしてセットされます。この関数を呼び出すときは、&restを記述しないでください。

以下はfooという架空の関数(function)の説明です:

Function: foo integer1 &optional integer2 &rest integers

関数foointeger2からinteger1を減じてから、その結果に残りすべての引数を加えます。integer2が与えられなかった場合、デフォルトして数値19が使用されます。

(foo 1 5 3 9)
     ⇒ 16
(foo 5)
     ⇒ 14

より一般的には、

(foo w x y…)
≡
(+ (- x w) y…)

慣例として引数の名前には、(たとえばintegerinteger1bufferのような)期待されるタイプ名が含めます。(buffersのような)複数形のタイプは、しばしばそのタイプのオブジェクトのリストを意味します。objectのような引き数名は、それが任意のタイプであることを表します(Emacsオブジェクトタイプのリストは、Lisp Data Typesを参照してください)。他の名前をもつ引数(たとえばnew-file)は、関数に固有の引数で、関数がドキュメント文字列をもつ場合、引数のタイプはその中で説明されるべきです(Documentationを参照してください)。

&optional&restにより修飾される引数の、より完全な説明は、Lambda Expressionsを参照してください。

コマンド(command)、マクロ(macro)、スペシャルフォーム(special form)の説明も同じフォーマットをもちますが、‘Function’が‘Command’、‘Macro’、‘Special Form’に置き換えられます。コマンドは単にインタラクティブに呼び出すことができる関数です。マクロは関数とは違う方法(引数は評価されません)で引数を処理しますは、同じ方法で記述されます。

マクロとスペシャルフォームにたいする説明には、特定のオプション引数や繰り替えされる引数のために、より複雑な表記が使用されます。なぜなら引数リストが、より複雑な方法で別の引数に分離されるからです。‘[optional-arg]’はoptional-argがオプションであることを意味し、‘repeated-args’は0個以上の引数を表します。カッコ(parentheses)は、複数の引数をリスト構造の追加レベルにグループ化するのに使用されます。以下は例です:

Special Form: count-loop (var [from to [inc]]) body…

この架空のスペシャルフォームは、 bodyフォームを実行してから変数varをインクリメントするループを実装します。最初の繰り返しでは変数は値fromをもちます。以降の繰り返しでは、変数は1(incが与えられた場合はinc)増加されます。vartoに等しい場合、bodyを実行する前にループをexitします。以下は例です:

(count-loop (i 0 10)
  (prin1 i) (princ " ")
  (prin1 (aref vector i))
  (terpri))

fromtoが省略された場合、ループを実行する前にvarnilがバインドされ、繰り返しの先頭においてvarが非nilの場合は、ループをexitします。以下は例です:

(count-loop (done)
  (if (pending)
      (fixit)
    (setq done t)))

このスペシャルフォームでは、引数fromおよびtoはオプションですが、両方を指定するか、両方を未指定にしなければなりません。これらの引数が与えられた場合、オプションでincも同様に指定することができます。これらの引数は、フォームのすべての残りの要素を含むbodyと区別するために、引数varとともにリストにグループ化されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.7.2 A Sample Variable Description

変数(variable)とは、オブジェクトにバインド(bind)(またはset)される名前です。変数がバインドされたオブジェクトのことを値(value)と呼びます。このような場合、その変数が値をもつ、という言い方もします。ほとんどすべての変数はユーザーがセットすることができますが、特にユーザーが変更できる特定の変数も存在し、これらはユーザーオプション(user options)と呼ばれます。通常の変数およびユーザーオプションは、関数と同様のフォーマットを使用して説明されますが、それらには引数がありません。

以下は架空の変数electric-future-mapにたいする説明です。

Variable: electric-future-map

この変数の値はElectric Command Futureモードで使用される完全なキーマップです。このマップの関数により、まだ実行していないコマンドの編集が可能になります。

ユーザーオプションも同じフォーマットをもちますが、‘Variable’が‘User Option’に置き換えられます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.4 Version Information

以下の機能は使用しているEmacsに関する情報を提供します。

Command: emacs-version &optional here

この関数は実行しているEmacsのバージョンを説明する文字列をreturnそます。バグレポートにこの文字列を含めるときに役立ちます。

(emacs-version)
  ⇒ "GNU Emacs 23.1 (i686-pc-linux-gnu, GTK+ Version 2.14.4)
             of 2009-06-01 on cyd.mit.edu"

hereが非nilの場合、関数はテキストをバッファーのポイントの前に挿入し、nilをreturnします。この関数がインタラクティブに呼び出された場合は、同じ情報をエコーエリアに出力しますが、プレフィクス引数を与えた場合は、hereが非nilになります。

Variable: emacs-build-time

この変数の値は、Emacsがビルドされた日時を示します。値は、current-timeの値と同様の、4つの整数からなるリストです(Time of Dayを参照してください)。

emacs-build-time
     ⇒ (20614 63694 515336 438000)
Variable: emacs-version

この変数の値は実行中のEmacsのバージョンで、"23.1.1"のような文字列です。この文字列の最後の数字は、実際にはEmacsのリリースバージョン番号の一部ではなく、任意のディレクトリーにおいてEmacsがビルドされる度にインクリメントされます。"22.0.91.1"のように4つの数字から構成される値は、それがリリースではないテストバージョンであることを示します。

Variable: emacs-major-version

Emacsのメジャーバージョン番号を示す整数です。Emacs 23.1では、値は23になります。

Variable: emacs-minor-version

Emacsのマイナーバージョン番号をしめす整数です。Emacs 23.1では、値は1になります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.5 Acknowledgments

このマニュアルは当初、Robert Krawitz、Bil Lewis、Dan LaLiberte、Richard M. Stallman、Chris Welty、GNUマニュアルグループのボランティアーにより、数年を費やして記述されました。Robert J. Chassellはこのマニュアルのレビューと編集をDefense Advanced Research Projects Agency、ARPA Order 6082のサポートのもとに手助けしてくれ、Computational Logic, IncのWarren A. Hunt, Jr.によりアレンジされました。それ以降も、追加のセクションがMiles Bader、Lars Brinkhoff、Chong Yidong、Kenichi Handa、Lute Kamstra、Juri Linkov、Glenn Morris、Thien-Thi Nguyen、Dan Nicolaescu、Martin Rudalics、Kim F. Storm、Luc Teirlinck、Eli Zaretskii、およびその他の人たちにより記述されました。

Drew Adams、Juanma Barranquero、Karl Berry、Jim Blandy、Bard Bloom、Stephane Boucher、David Boyes、Alan Carroll、Richard Davis、Lawrence R. Dodd、Peter Doornbosch、David A. Duff、Chris Eich、Beverly Erlebacher、David Eckelkamp、Ralf Fassel、Eirik Fuller、Stephen Gildea、Bob Glickstein、Eric Hanchrow、Jesper Harder、George Hartzell、Nathan Hess、Masayuki Ida、Dan Jacobson、Jak Kirman、Bob Knighten、Frederick M. Korz、Joe Lammens、Glenn M. Lewis、K. Richard Magill、Brian Marick、Roland McGrath、Stefan Monnier、Skip Montanaro、John Gardiner Myers、Thomas A. Peterson、Francesco Potortì、Friedrich Pukelsheim、Arnold D. Robbins、Raul Rockwell、Jason Rumney、Per Starbäck、Shinichirou Sugou、Kimmo Suominen、Edward Tharp、Bill Trost、Rickard Westman、Jean White、Eduard Wiebe、Matthew Wilding、Carl Witty、Dale Worley、Rusty Wright、David D. Zuhnにより訂正が提供されました。

より完全な貢献者のリストは、Emacsソースリポジトリーの関連する変更ログエントリーを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2 Lisp Data Types

Lispのオブジェクト(object)とは、Lispおプログラムにより操作されるデータです。型(type)データ型(data type)は、可能なオブジェクトの集合を意味します。

すべてのオブジェクトは少なくとも1つの型に属します。同じ型のオブジェクトは、同様な構造をもち、通常は同じコンテキストで使用されます。型は重複でき、オブジェクトは複数の型に属することができます。結果として、あるオブジェクトが特定の型に属するかどうかを尋ねることはできますが、オブジェクトが“その”型だけに属するかどうかは決定できません。

多くはありませんがEmacsにはいくつかの基本オブジェクト型が組み込まれています。これらの型は、他のすべての型を構成するもとであり、基本型(primitive types)と呼ばれます。すべてのオブジェクトはただ1つの基本型に属します。これらの型には、整数(integer)浮動小数点数(float)コンス(cons)シンボル(symbol)文字列(string)ベクター(vector)ハッシュテーブル(hash-table)サブルーチン(subr)バイトコード関数(byte-code function)、およびbufferのような編集に関連した特別な型(Editing Typesを参照してください)が含まれます。

基本型にはそれぞれ、オブジェクトがその型のメンバーかどうかのチェックを行なう、対応するLisp関数があります。

他の多くの言語とは異なり、Lispのオブジェクトは自己記述(self-typing)的です。オブジェクトの基本型は、オブジェクト自体に暗に含まれます。たとえばオブジェクトがベクターの場合、それを数字として扱うことはできません。Lispはベクターが数字でないことを知っているのです。

多くの言語では、プログラマーは各変数にたいしてデータ型を宣言しなければならず、コンパイラーは型を知っていますが、データの中に型はありません。Emacs Lispには、このような型宣言はありません。Lisp変数は任意の型の値をもつことができ、変数に保存した値と型を記憶します(実際には、特定の型の値だけをもつことができる少数のEmacs Lisp変数があります。Variables with Restricted Valuesを参照してください)。

このチャプターでは、GNU Emacs Lispの各標準型の意味、プリント表現(printed representation)、入力構文(read syntax)を説明します。これらのデータ型を使用する方法についての詳細は、以降のチャプターを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 Printed Representation and Read Syntax

オブジェクトのプリント表現(printed representation)とは、オブジェクトにたいしてLispプリンター(関数prin1)が生成する出力のフォーマットです。すべてのデータ型は一意なプリント表現をもちます。オブジェクトの入力構文(read syntax)とは、オブジェクトにたいしてLispリーダー(関数read)が受け取る入力のフォーマットです。これは一意である必要はありません。多くの種類のオブジェクトが複数の構文をもちます。Reading and Printing Lisp Objectsを参照してください。

ほとんどの場合、オブジェクトのプリント表記が、入力構文としても使用されます。しかしLispプログラム内の定数とすることに意味が無いいくつかの型には、入力構文がありません。これらのオブジェクトはハッシュ表記(hash notation)でプリントされ、‘#<’、説明的な文字列(典型的には型名にオブジェクトの名前を続けたもの)、‘>’で構成される文字列です。たとえば:

(current-buffer)
     ⇒ #<buffer objects.texi>

ハッシュ表気は読み取ることができないので、Lispリーダーは‘#<’に遭遇すると、常にエラーinvalid-read-syntaxをシグナルします。

他の言語では、式はテキストであり、これ以外の形式はありません。Lispでは、第一に式はLispオブジェクトであって、オブジェクトの入力構文であるテキストは副次的なものに過ぎません。たいてい、この違いを強調する必要はありませんが、このことを心に留めておかないと、たまに混乱することがあるでしょう。

インタラクティブに式を評価するとき、Lispインタープリターは最初にそれのテキスト表現を読み取り、Lispオブジェクトを生成してから、そのオブジェクトを評価します(Evaluationを参照してください)。しかし評価と読み取りは、別の処理です。読み取りによりテキストにより表現されたLispオブジェクトを読み取り、Lispオブジェクトがreturnされます。後でオブジェクトは評価されるかもしれないし、評価されないかもしれません。オブジェクトを読み取るための基本的な関数readの説明は、Input Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2 Comments

コメント(comment)hqあ、プログラム中に記述されたテキストであり、そのプログラムを読む人間ためだけに存在し、プログラムの意味には何の影響ももちません。Lispでは、それが文字列や文字定数にある場合をのぞき、セミコロン(‘;’)でコメントが開始されます。行の終端までがコメントになります。Lispリーダーはコメントを破棄します。コメントはLispシステム内でプログラムを表すLispオブジェクトの一部にはなりません。

#@count’構成は、次のcount個の文字をスキップします。これはプログラムにより生成されたバイナリーデータを含むコメントにたいして有用です。Emacs Lisp倍とコンパイラーは、出力ファイルにこれを使用します(Byte Compilationを参照してください)。しかしソースファイル用ではありません。

コメントのフォーマットにたいする慣例は、Tips on Writing Commentsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3 Programming Types

Emacs Lispには2種類の一般的な型があります。1つはLispプログラミングに関わるもので、もう1つは編集に関わるものです。前者はさまざまな形で多くのLisp実装に存在します。後者はEmacs Lispに固有です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.1 Integer Type

整数の値の範囲はマシンに依存します、最小のレンジは-536,870,912から536,870,911(30ビットでは -2**29 から 2**29 - 1) ですが、多くのマシンはこれより広い範囲を提供します。Emacs Lispの数学関数は整数のオーバーフローをチェックしません。したがってEmacsのh整数が30ビットの場合、(1+ 536870911)は-536,870,912になります。

整数にたいする入力構文は、(10を基数とする)数字のシーケンスで、オプションで先頭に符号、最後にピリオドがつきます。Lispインタープリターにより生成されるプリント表記には、先頭の ‘+’や、最後の‘.’はありません。

-1               ; 整数の-1.
1                ; 整数の1.
1.               ; これも整数の1.
+1               ; これも整数の1.

特別な例外として、数字シーケンスが有効なオブジェクトとしては大きすぎる、または小さすぎる整数を指定する場合、Lispリーダーはそれを浮動小数点数(Floating-Point Typeを参照してください)として読み取ります。たとえば、Emacsの整数が30ビットの場合、536870912は浮動小数点数の536870912.0として読み取られます。

詳細は、Numbersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.2 Floating-Point Type

浮動小数点数は、コンピューターにおける科学表記に相当するものです。浮動小数点数を10の指数をともなう有理数として考えることができます。正確な有効桁数と可能な指数は、マシン固有です。Emacsは値の保存にCデータ型のdoubleを使用し、内部的には10の指数ではなく、2の指数として記録します。

浮動小数点数のプリント表現には、(後に最低1つの数字をともなう)小数点と、指数のどちらか一方、または両方が必要です。たとえば‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は、いずれも浮動小数点数の1500を記述し、これらはすべて等価です。

詳細は、Numbersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3 Character Type

Emacs Lispでの文字(character)は、整数以外の何者でもありません。他の言い方をすると、文字は文字コードで表現されます。たとえば文字Aは、整数の65として表現されます。

プログラムで文字を個別に使用するのは稀であり、文字のシーケンスとして構成される文字列(strings)として扱われるのがより一般的です。String Typeを参照してください。

文字列やバッファーの中の文字は、現在のところ0から4194303の範囲 — つまり22ビットに制限されています(Character Codesを参照してください)。0から127のコードはASCIIコードで、残りは非ASCIIです(Non-ASCII Charactersを参照してください)。キーボード入力を表す文字は、Control、Meta、Shiftなどの修飾キーをエンコードするために、より広い範囲をもちます。

メッセージのために、文字にたいして人間が読むことができるテキストによる説明を生成する特別な関数が存在します。Describing Characters for Help Messagesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.1 Basic Char Syntax

文字は実際には整数なので、文字のプリント表現は10進数です。文字にたいする入力構文も利用可能ですが、Lispプログラムでこの方法により文字を記述するのは、明解なプログラミングではありません。文字にたいしては、Emacs Lispが提供する、特別な入力構文を常に使用するべきです。これらの構文フォーマットはクエスチョンマークで開始されます。

英数字にたいする通常の入力構文は、クエスチョンマークと、その後にその文字を記述します。したがって文字Aにたいしては‘?A’、文字Bにたいしては‘?B’、文字aにたいしては‘?a’となります。

たとえば:

?Q ⇒ 81     ?q ⇒ 113

句読点文字にも同じ構文を使用できますが、Lispコードを編集するためのEmacsコマンドが混乱しないように、‘\’を追加するのがよい場合がしばしばあります。たとえば開きカッコを記述するために‘?\(’と記述します。その文字が‘\’の場合、それをクォートするために、‘?\\’のように2つ目の‘\’を使用しなければなりません

control-g、backspace、tab、newline、vertical tab、formfeed、space、return、del、escapeはそれぞれ‘?\a’、‘?\b’、‘?\t’、‘?\n’、‘?\v’、‘?\f’、‘?\s’、‘?\r’、‘?\d’、‘?\e’と表すことができます(後にダッシュのついた‘?\s’は違う意味をもちます — これは後続の文字にたいして“super”の修飾を適用します)。したがって、

?\a ⇒ 7                 ; control-g, C-g
?\b ⇒ 8                 ; backspace, BS, C-h
?\t ⇒ 9                 ; tab, TAB, C-i
?\n ⇒ 10                ; newline, C-j
?\v ⇒ 11                ; vertical tab, C-k
?\f ⇒ 12                ; formfeed character, C-l
?\r ⇒ 13                ; carriage return, RET, C-m
?\e ⇒ 27                ; escape character, ESC, C-[
?\s ⇒ 32                ; space character, SPC
?\\ ⇒ 92                ; backslash character, \
?\d ⇒ 127               ; delete character, DEL

バックスラッシュが“エスケープ文字(escape character)”の役割を果たすので、これらのバックスラッシュで始まるシーケンスはエスケープシーケンス(escape sequences)とも呼ばれます。この用語法は、文字ESCとは関係ありません。‘\s’は文字定数としての使用を意図しており、文字定数の内部では、単にスペースを記述します。

エスケープという特別な意味を与えずに、任意の文字の前にバックスラッシュの使用することは許されており、害もありませんしたがって‘?\+’は‘?+’と等価です。ほとんどの文字の前にバックスラッシュを追加することに理由はありません。しかし、Lispコードを編集するEmacsコマンドが混乱するのを避けるために、文字‘()\|;'`"#.,’の前にはバックスラッシュを追加するべきです。space、tab、newline、formfeedのような空白文字の前にもバックスラッシュを追加できます。しかし、tabやspaceのような実際の空白文字のかわりに、‘\t’や‘\s’のような可読性のあるエスケープシーケンスを使用するほうが明解です(スペースを後にともなうバックスラッシュを記述する場合、後続のテキストと区別するために、文字定数の後に余分なスペースを記述するべきです)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.2 General Escape Syntax

特に重要なコントロール文字にたいする特別なエスケープシーケンスに加えて、Emacsは非ASCIIテキスト文字の指定に使用できる、何種類かのエスケープ構文を提供します。

最初に、文字をUnicodeの値で指定することができます。?\unnnnはUnicodeのコードポイント‘U+nnnn’の文字を表します。ここでnnnnは、(慣例により)正確に4桁の16進数です。バックスラッシュは、後続の文字がエスケープシーケンスを形成することを示し、‘u’はUnicodeエスケープシーケンスを指定します。

U+ffffより大きなコードポイントをもつUnicode文字を指定するために、若干異なる構文が存在します。?\U00nnnnnnはコードポイント‘U+nnnnnn’の文字を表します。ここでnnnnnnは6桁の16進数です。Unicode Standardは‘U+10ffff’までのコードポイントだけを定義するので、これより大きいコードポイントを指定すると、Emacsはエラーをシグナルします。

次に、文字を16進の文字コードで指定できます。16進エスケープシーケンスは、バックスラッシュ、‘x’、および16進の文字コードにより構成されます。したがって‘?\x41’は文字A、‘?\x1’は文字C-a?\xe0は grave accentつきの文字‘a’を表します。 任意の数の16進数を使用できるので、この方法により任意の文字コードを表すことができます。

最後に、8進の文字コードにより文字を指定できます。8進エスケープシーケンスは、3桁までの8進数字をともなうバックスラッシュにより形成されます。したがって‘?\101’は文字A、‘?\001’は文字C-a?\002は文字C-bを表します。この方法で指定できるのは、8進コード777までの文字だけです。

これらのエスケープシーケンスは、文字列内でも使用されます。Non-ASCII Characters in Stringsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.3 Control-Character Syntax

他の入力構文を使用してコントロール文字を表すことができます。これは後にバックスラッシュ、カレット、対応する非コントロール文字(大文字か小文字)をともなうクエスチョンマークから構成されます。たとえば‘?\^I’と‘?\^i’はどちらも、値が9である文字C-iにたいする、有効な入力構文です。

^’のかわりに、‘C-’を使用することもできます。したがって‘?\C-i’は、‘?\^I’や‘?\^i’と等価です。

?\^I ⇒ 9     ?\C-I ⇒ 9

文字列やバッファーの中では、ASCIIのコントロール文字だけが許されますが、キーボード入力にたいしては‘C-’により任意の文字をコントロール文字にすることができます。これらの非ASCIIのコントロール文字にたいするコントロール文字には 非コントロール文字にたいするコードと同様に、2**26 ビットが含まれます。通常のテキスト端末には、非ASCIIコントロール文字を生成する方法がありませんが、Xおよび他のウィンドウシステムを使用することにより、簡単に生成することができます。

歴史的な理由により、EmacsはDEL文字を、?のコントロール文字として扱います:

?\^? ⇒ 127     ?\C-? ⇒ 127

結果として、Xでは有意な入力文字であるControl-?文字を、‘\C-’を使用して表現することは今のところできません。さまざまなLispファイルがこの方法によりDELを参照するため、これを変更するのは簡単ではありません。

コントロール文字の表現はファイルや文字列のなかで見ることができますが、わたしたちは‘^’構文を推奨します。キーボード入力にたいするコントロール文字に好ましいのは、‘C-’構文です。どちらを使用するかはプログラムの意味に影響しませんが、プログラムを読む人の理解を助けるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.4 Meta-Character Syntax

メタ文字(meta character)とは、META修飾キーとともにタイプされた文字です。そのような文字を表す整数には 2**27 のビットがセットされています。基本的な文字コードの広い範囲を利用可能にするために、メタや他の修飾にたいして上位ビットを使用します。

文字列では、メタ文字を示すASCII文字に、 2**7 ビットが付加されます。したがって文字列に含めることができるメタ文字のコードは1から255の範囲となり、メタ文字は通常のASCII文字のメタ修飾されたバージョンとなります。文字列内でのMETA処理の詳細については、Putting Keyboard Events in Stringsを参照してください。

メタ文字の入力構文には‘\M-’を使用します。たとえば‘?\M-A’はM-Aを意味します。8進文字コード(以下参照)や、‘\C-’、その他の文字にたいする他の構文とともに‘\M-’を使用できます。したがって、M-Aは‘?\M-A’や‘?\M-\101’と記述できます。同様に、C-M-bは‘?\M-\C-b’、‘?\C-\M-b’、‘?\M-\002’と記述することができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.5 Other Character Modifier Bits

グラフィック文字(graphic character)の大文字小文字は、文字コードで示されます。たとえばASCIIでは、文字‘a’と文字‘A’は区別されます。しかしASCIIにはコントロール文字が大文字なのか小文字なのかを表現する方法がありません。コントロール文字がタイプされたときシフトキーが使用されたかを示すために、Emacsは 2**25 のビットを使用します。この区別は、X端末や、他の特別な端末を使用しているときだけ可能です。通常のテキスト端末は、これらの違いを報告しません。シフトをあらわすビットのためのLisp構文は‘\S-’です。したがって‘?\C-\S-o’や‘?\C-\S-O’は、shifted-control-o文字を表します。

Xウィンドウシステムは文字にセットできる、他に3つ修飾ビット — hypersuperaltを定義します。これらのビットにたいする構文は、‘\H-’、‘\s-’、‘\A-’です(これらのプレフィクスでは、大文字小文字は意味があります)。したがって‘?\H-\M-\A-x’はAlt-Hyper-Meta-xを表します(‘-’が後にない‘\s’は、スペース文字を表すことに注意してください)。 数値的には、ビット値2**22はalt、2**23はsuper、2**24はhyperです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.4 Symbol Type

GNU Emacs Lispでのシンボル(symbol)とは、名前をもつオブジェクトです。シンボル名は、そのシンボルのプリント表現としての役割があります。Lispの通常の使用では、1つのobarray(Creating and Interning Symbolsを参照してください)により、シンボル名は一意です — 2つのシンボルが同じ名前をもつことはありません。

シンボルは、変数、関数名としての役割や、プロパティーリストを保持する役割をもつことができます。他のすべてのLispオブジェクトから区別するためだけの役割をもつ場合もあり、データ構造内にそのようなシンボルが存在することは、確実に認識されるでしょう。与えられたコンテキストにおいて、通常はこれらのうちの1つの使用だけが意図されます。しかし3つすべての方法で、1つのシンボルを独立して使用することもできます。

名前がコロン(‘:’)で開始されるシンボルは、キーワードシンボル(keyword symbol)と呼ばれます。これらのシンボルは自動的に定数として振る舞い、通常は未知のシンボルと、いくつかの特定の候補を比較することだけに使用されます。Variables that Never Changeを参照してください。

シンボル名にはどんな文字でも含めることができます。ほとんどのシンボル名は英字、数字、‘-+=*/’などの句読点文字で記述されます。このような名前には、特別な句読点文字は必要ありません。名前が数字のように見えない限りは、名前にはどのような文字も使用できます(名前が数字のように見える場合は、名前の先頭に‘\’を記述して、強制的にシンボルとして解釈させます)。文字‘_~!@$%^&:<>{}?’はあまり使用されませんが、これらも特別な句読点文字を必要としません。他の文字も、バックスラッシュでエスケープすることにより、シンボル名に含めることができます。しかし、文字列内でのバックスラッシュの使用とは対照的に、シンボル名でのバックスラッシュは、バックスラッシュの後の1文字をエスケープするだけです。たとえば文字列内では、‘\t’はタブ文字を表します。しかしシンボル名の中では、‘\t’は英字‘t’をクォートするに過ぎません。 名前にタブ文字をもつシンボルを記述するには、(バックスラッシュを前置した)実際のタブを使用しなければなりません。しかし、そのようなことを行なうことは、めったにありません。

Common Lispに関する注意:Common Lispでは、明示的にエスケープされない限り、小文字は常に大文字に“フォールドされ(folded)”ます。Emacs Lispでは大文字と小文字は区別されます。

以下はシンボル名の例です。4番目の例の中の‘+’は、シンボルが数字として読み取られるのを防ぐために、エスケープされていることに注意してください。6番目の例では、名前の残りの部分により数字としては不正なので、エスケープの必要はありません。

foo                 ; foo’という名前のシンボル。
FOO                 ; foo’とは別の、‘FOO’という名前のシンボル。
1+                  ; 1+’という名前のシンボル
                    ;   (整数の‘+1’ではありません)。
\+1                 ; +1’という名前のシンボル
                    ;   (とても読みやすい名前とはいえません)。
\(*\ 1\ 2\)         ; (* 1 2)’という名前のシンボル(悪い名前)。
+-*/_~!@$%^&=:<>{}  ; +-*/_~!@$%^&=:<>{}’という名前のシンボル。
                    ;   これらの文字はエスケープする必要はありません。

シンボル名がプリント表現としての役割をもつというルールの例外として、‘##’があります。これは、名前が空文字列の、internされたシンボルのプリント表現です。さらに‘#:foo’は、internされていないfooという名前のシンボルにたいするプリント表現です(通常、Lispリーダーはすべてのシンボルをinternします。Creating and Interning Symbolsを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.5 Sequence Types

シーケンス(sequence)とは、要素の順序セットを表現する、Lispオブジェクトです。Emacs Lispには、2種類のシーケンス — リスト(lists)配列(arrays)があります。

リストはもっとも一般的に使用されるシーケンスです。リストは任意の型の要素を保持でき、要素の追加・削除により簡単に長さを変更できます。リストについては、次のサブセクションを参照してください。

配列は固定長のシーケンスです。配列はさらに文字列(strings)、ベクター(vectors)、文字テーブル(char-tables)、ブールベクター(bool-vectors)に細分されます。ベクターは任意の型の要素を保持できますが、文字列の要素は文字でなければならず、ブールベクターの要素はtnilでなければなりません。文字テーブルはベクターと似ていますが、有効な文字によりインデックスづけされる点が異なります。文字列内の文字は、バッファー内の文字のようにテキストプロパティーをもつことができます(Text Propertiesを参照してください)。しかしベクターは、その要素が文字のときでも、テキストプロパティーをサポートしません。

リスト、文字列、およびその他の配列型も、重要な類似点を共有します。たとえば、それらはすべて長さlをもち、要素は0からl-1でインデックスづけされます。いくつかの関数はシーケンス関数と呼ばれ、これらは任意の種類のシーケンスを許容します。たとえば、関数lengthは、任意の種類のシーケンスの長さを報告します。Sequences, Arrays, and Vectorsを参照してください。

シーケンスは読み取りにより常に新たに作成されるので、同じシーケンスを2回読み取るのは、一般的に不可能です。シーケンスにたいする入力構文を2回読み取った場合、内容が等しい2つのシーケンスを得ます。これには1つ例外があります。空リスト()は、常に同じオブジェクトnilを表します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6 Cons Cell and List Types

コンスセル(cons cell)は、CARスロット、CDRスロットと呼ばれる2つのスロットから構成されるオブジェクトです。各スロットは、任意のLispオブジェクトを保持できます。そのときCARスロットに保持されるオブジェクトが何であれ、わたしたちは“このコンスセルのCAR”のような言い方をします。これはCDRの場合も同様です。

リスト(list)は、コンスセルの連続するシリーズで、各コンスセルのCDRスロットは、次のコンスセル、または空リストを保持します。空リストは実際にはシンボルnilです。詳細については、Listsを参照してください。ほとんどのコンスセルはリストの一部として使用されるので、わたしたちはコンスセルにより構成される任意の構造を、リスト構造(list structure)という用語で参照します。

Cプログラマーにたいする注意: Lispのリストはコンスセルにより構築される、リンクリスト(linked list)として機能します。Lispではポインターは暗黙的なので、わたしたちはコンスセルのスロットが、値を“保持(hold)”するのか、それとも値を“指す(point)”のかを区別しません。

コンスセルはLispの中心なので、“コンスセルではないオブジェクト”にたいする単語もあります。これらのオブジェクトはアトム(atoms)と呼ばれます。

リストにたいする入力構文とプリント表現は等しく、それは左カッコ、任意の数の要素、右カコから構成されます。以下はリストの例です:

(A 2 "A")            ; 3要素のリスト。
()                   ; 要素がないリスト(空リスト)。
nil                  ; 要素がないリスト(空リスト)。
("A ()")             ; 1要素のリスト: 文字列"A ()"
(A ())               ; 2要素のリスト: Aと空リスト。
(A nil)              ; 同上
((A B C))            ; 1要素のリスト
                     ;   (この要素は、3要素のリスト)。

読み取りにおいては、カッコの内側は、リストの要素になります。つまり、コンスセルは各要素から作成されます。コンスセルのCARスロットは要素を保持し、CDRスロットはリスト内の次のコンスセル(このコンスセルはリスト内の次の要素を保持します)を参照します。最後のコンスセルのCDRスロットは、nilを保持するようにセットされます。

CARCDRという名称は、Lispの歴史に由来します。オリジナルのLisp実装はIBM 704コンピューターで実行されていました。ワードを2つの部分、つまり“address”と呼ばれる部分と、“decrement”と呼ばれる部分に分割していて、その際CARはaddress部から内容を取り出す命令で、CDRはdecrement部から内容を取り出す命令でした。対照的に“cons cells”は、これらを作成する関数consから命名されました。この関数は関数の目的、すなわちセルを作る(construction of cells)という目的から命名されました。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6.1 Drawing Lists as Box Diagrams

コンスセルを表現するドミノのような1対のボックスによる図により、リストを説明することができます(Lispリーダーがこのような図を読み取ることはできません。人間およびコンピューターが理解できるテキスト表記と異なり、ボックスの図は人間だけが理解できます)。この図は3要素のリスト(rose violet buttercup)を表したものです:

    --- ---      --- ---      --- ---
   |   |   |--> |   |   |--> |   |   |--> nil
    --- ---      --- ---      --- ---
     |            |            |
     |            |            |
      --> rose     --> violet   --> buttercup

この図では、ボックスは任意のLispオブジェクトへの参照を保持できるスロットを表します。ボックスのペアはコンスセルを表します。矢印はLispオブジェクト(アトム、または他のコンスセル)への参照を表します。

この例では、1番目のボックスは1番目のコンスセルで、それのCARrose(シンボル)を参照または“保持(holds)”します。2番目のボックスは1番目のコンスセルのCDRを保持し、次のボックスペア、すなわち2番目のコンスセルを参照します。2番目のコンスセルのCARvioletで、CDRは3番目のコンスセルです。(最後の)3番目のコンスセルのCDRは、nilです。

同じリスト(rose violet buttercup)を、違うやり方で描いた別の図で表してみましょう:

 ---------------       ----------------       -------------------
| car   | cdr   |     | car    | cdr   |     | car       | cdr   |
| rose  |   o-------->| violet |   o-------->| buttercup |  nil  |
|       |       |     |        |       |     |           |       |
 ---------------       ----------------       -------------------

要素がないリストは空リスト(empty list)で、これはシンボルnilと同じです。別の言い方をすると、nilはシンボルであり、リストでもあります。

以下は、リスト(A ())、または等価な(A nil)をボックスと矢印で描いたものです:

    --- ---      --- ---
   |   |   |--> |   |   |--> nil
    --- ---      --- ---
     |            |
     |            |
      --> A        --> nil

以下はもっと複雑な例です。これは、1番目の要素が2等疎のリスとである、3要素のリスト((pine needles) oak maple)を表します:

    --- ---      --- ---      --- ---
   |   |   |--> |   |   |--> |   |   |--> nil
    --- ---      --- ---      --- ---
     |            |            |
     |            |            |
     |             --> oak      --> maple
     |
     |     --- ---      --- ---
      --> |   |   |--> |   |   |--> nil
           --- ---      --- ---
            |            |
            |            |
             --> pine     --> needles

同じリストを2番目のボックス表記で表すと、以下のようになります:

 --------------       --------------       --------------
| car   | cdr  |     | car   | cdr  |     | car   | cdr  |
|   o   |   o------->| oak   |   o------->| maple |  nil |
|   |   |      |     |       |      |     |       |      |
 -- | ---------       --------------       --------------
    |
    |
    |        --------------       ----------------
    |       | car   | cdr  |     | car     | cdr  |
     ------>| pine  |   o------->| needles |  nil |
            |       |      |     |         |      |
             --------------       ----------------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6.2 Dotted Pair Notation

ドットペア表記(dotted pair notation)CARCDRが明示的に表されたコンスセルにたいする、一般的な構文です。この構文では、(a . b)は、CARがオブジェクトaで、CDRがオブジェクトbという意味になります。CDRがリスとである必要がないので、ドットペア表記は、より一般的なリスト構文です。しかしキスと構文が機能するでような場合には、より扱いにくくなります。ドットペア表記では、リスト‘(1 2 3)’は、‘(1 . (2 . (3 . nil)))’と記述されます。nilで終端されたリストにたいしては、どちらの表記法も使用できますが、リスト表記の方が、通常は明解で便利です。リストをプリントする場合、コンスセルのCDRがリスとでないときだけ、ドットペア表記が使用されます。

以下はボックスを使用してドットペア表記を表した例です。この例はペア(rose . violet)を表します。

    --- ---
   |   |   |--> violet
    --- ---
     |
     |
      --> rose

最後のCDRが非nilのコンスセルのチェーンを表すために、ドットペア表記とリスト表記を組み合わせることができます。リストの最後の要素の後にドットを記述して、その後に最後のコンスセルのCDRを記述します。たとえば、(rose violet . buttercup)は、(rose . (violet . buttercup))と等価です。オブジェクトは以下のようになります:

    --- ---      --- ---
   |   |   |--> |   |   |--> buttercup
    --- ---      --- ---
     |            |
     |            |
      --> rose     --> violet

構文(rose . violet . buttercup)は無効です。なぜならこれが意味することは何もないからです。何かあるにしても、violetのためにCDRがすでに使用されているコンスセルのCDRbuttercupを置く、ということになります。

リスト(rose violet)(rose . (violet))と等価であり、以下のようになります:

    --- ---      --- ---
   |   |   |--> |   |   |--> nil
    --- ---      --- ---
     |            |
     |            |
      --> rose     --> violet

同様に3要素のリスト(rose violet buttercup)は、(rose . (violet . (buttercup)))と等価です。 これは以下のようになります:

    --- ---      --- ---      --- ---
   |   |   |--> |   |   |--> |   |   |--> nil
    --- ---      --- ---      --- ---
     |            |            |
     |            |            |
      --> rose     --> violet   --> buttercup

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6.3 Association List Type

連想リスト(association list)またはalistは、要素がコンスセルであるように特別に構成されたリストです。各要素においては、CARキー(key)で、CDR連想値(associated value)であると考えます(連想値がCDRCARに保存される場合もあります)。リストの先頭に連想値を追加したり削除するのが簡単なので、連想リストはスタック(stack)にしばしば使用されます。

たとえば、

(setq alist-of-colors
      '((rose . red) (lily . white) (buttercup . yellow)))

これは変数alist-of-colorsに3葉疎のalistをセットします。最初の要素では、roseがキーで、redが値になります。

alistと、alistに関数についての詳細な説明は、Association Listsを参照してください。テーブルを照合する、(多くのキーの操作を、より速く行なう)他の手段については、Hash Tablesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.7 Array Type

配列(array)は、他のLispオブジェクトを保持または参照する、任意の数のスロットから構成され、メモリーの連続ブロックに配列されます。配列の任意の要素へのアクセス時間は、大体同じです。対照的に、リストの要素にたいするアクセスは、リスト内でのその要素の位置に比例した時間を要します(リストの最後の要素にアクセスするには、リストの最初の要素にアクセスするより、長い時間を要します)。

Emacsは文字列(strings)、ベクター(vectors)、ブールベクター(bool-vectors)、文字テーブル(char-tables)という、4種の配列を定義します。

文字列は文字の配列で、ベクターは任意のオブジェクトの配列です。ブールベクターはtnilだけを保持できます。この種の配列は、もっとも大きい整数までの、任意の長さをもつことができます。文字テーブルは、任意の有効な文字コードによりインデックスづけされる疎な配列で、任意のオブジェクトを保持することができます。

配列の最初の要素はインデックス0、2番目の要素はインデックス1、...となります。これは0基準zero-originのインデックスづけと呼ばれます。たとえば、4要素の配列は、インデックス0、1、2、3をもちます。利用できる最大のインデックス値は、配列の長さより1小さくなります。1度配列が作成されると、長さは固定されます。

Emacs Lispのすべての配列は、1次元です(他のほとんどのプログラミング言語は多次元配列をサポートしますが、これらは必須ではありません。ネストされた1次元配列により同じ効果を得ることができます)。各種の配列のは、独自の入力構文をもちます。詳細は以降のセクションを参照してください。

配列型はシーケンス型のサブセットであり、文字列型、ベクター型、ブールベクター型、文字テーブル型が含まれます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8 String Type

文字列(string)とは、文字の配列です。Emacsがテキストエディターであることから予想できるように、文字列は、たとえばLispシンボルの名前、ユーザーへのメッセージ、バッファーから抽出されたテキストの表現など、多くの目的のために使用されます。Lispの文字列は定数です。文字列を評価すると、それと同じ文字列がreturnされます。

文字列を操作する関数については、Strings and Charactersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8.1 Syntax for Strings

文字列にたいする入力構文は、"like this"のように、ダブルクォート、任意個の文字、もう1つのダブルクォートから構成されます。文字列内にダブルクォートを含める場合は、それの前にバックスラッシュを記述します。したがって、"\""は1つのダブルクォート文字だけを含む文字列です。同様に、バックスラッシュを含める場合は、"this \\ is a single embedded backslash"のように、それの前にもう1つのバックスラッシュを記述します。

文字列にたいする入力構文では、改行(newline)は特別ではありません。ダブルクォートの間に改行を記述すれば、その改行は文字列内の文字となります。しかしエスケープされた改行 — 前に‘\’をともなう改行 —は文字列の一部とはなりません。同様に、エスケープされたスペース‘\  も無視されます。

"It is useful to include newlines
in documentation strings,
but the newline is \
ignored if escaped."
     ⇒ "It is useful to include newlines
in documentation strings,
but the newline is ignored if escaped."

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8.2 Non-ASCII Characters in Strings

Emacdの文字列内の非ASCII文字にたいしては、2つのテキスト表現 — マルチバイト(multibyte)とユニバイト(unibyte)があります(Text Representationsを参照してください)。大まかに言うと、ユニバイト文字列にはraw(生)バイトが保存され、マルチバイト文字列には人間が読めるテキストが保存されます。ユニバイト文字列内の各文字はバイトであり、値は0から255となります。対照的に、マルチバイト文字列内の各文字は、0から4194303の値をもつかもしれません(Character Typeを参照してください)。両方とも、127より上の文字は非ASCIIです。

文字をリテラルとして記述することにより、文字列に非ASCII文字を含めることができます。マルチバイトのバッファーや文字列、あるいはマルチバイトとしてvisitされたファイル等の、マルチバイトのソースから文字列定数を読み込む場合、Emacsは非ASCII文字をマルチバイト文字として読み取り、その文字列を自動的にマルチバイト文字列にします。ユニバイトのソースから文字列定数を読み込む場合、Emacsは非ASCII文字をユニバイト文字として読み取り、その文字列を湯にバイト文字列にします。

マルチバイト文字列内にリテラルとして文字を記述するかわりに、エスケープシーケンスを使用して文字コードとして記述できます。エスケープシーケンスについての詳細は、General Escape Syntaxを参照してください。

文字列定数内でUnicodeスタイルのエスケープシーケンス‘\uNNNN’または‘\U00NNNNNN’を使用する場合、(たとえASCII文字の場合でも)Emacsは自動的に文字列をマルチバイトとみなします。

文字列定数内で、16進エスケープシーケンス(‘\xn’)、および8進エスケープシーケンス(‘\n’)を使用することもできます。しかし注意してください: 文字列定数が16進または8進のエスケープシーケンスを含み、それらのエスケープシーケンスすべてがユニバイト文字(256より小)を指定していて、その文字列内に他にリテラルの非ASCII文字またはUnicodeスタイルのエスケープシーケンスが存在しない場合、Emacsは自動的に文字列をユニバイト文字列とみなします。つまり文字列内のすべての非ASCII文字は8ビットのrawバイトとみなされます。

16進および8進のエスケープシーケンスではエスケープされた文字コードは可変個の数字を含むかもしれないので、それに続く文字で、16進および8進として有効ではない最初の文字は、エスケープシーケンスを終了させます。文字列内の次の文字が16進または8進として解釈できる文字の場合は、‘\  (バックスラッシュとスペース)を記述して、エスケープシーケンスを終了できます。たとえば‘\xe0\ はgrave accentつきの‘a’という、1文字を表します。文字列内の‘\  は、バックスラッシュー改行と同様です。これは文字列内の文字とはなりませんが、先行する16進エスケープを終了します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8.3 Nonprinting Characters in Strings

リテラル文字と同様に、文字列定数内でバックスラッシュによるエスケープシーケンスを使用できます(ただし文字定数を開始するクエスチョンマークは使用しません)。たとえば、非プリント文字のタブとC-aを含む文字列は、"\t, \C-a"のように、それらの間にカンマとスペースを記述します。文字にたいする入力構文の説明は、Character Typeを参照してください。

しかし、バックスラッシュによるエスケープシーケンスとともに記述できるすべての文字が、文字列内で有効というわけではありません。文字列が保持できるコントロール文字は、ASCIIコントロール文字だけです。ASCIIコントロール文字では、文字列の大文字小文字は区別されません。

正確に言うと、文字列はメタ文字を保持できません。しかし文字列がキーシーケンスとして使用される場合、文字列内でメタで修飾されたASCII文字を表現するための方法を提供する、特別な慣習があります。文字列定数内でメタ文字を示すために‘\M-’構文を使用した場合、これは文字列内の文字の 2**7 のビットをセットします。その文字列がdefine-keyまたはlookup-keyで使用される場合、この数字コードは等価なメタ文字に変換されます。Character Typeを参照してください。

文字列はhyper、super、altで修飾された文字を保持できません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8.4 Text Properties in Strings

文字列は、その文字自身に加えて、文字のプロパティーも保持することができます。これにより、特別なことをしなくても、文字列とバッファーとの間でテキストをコピーするプログラムが、テキストプロパティーをコピーすることが可能になります。テキストプロパティーが何を意味するかについての説明は、Text Propertiesを参照してください。テキストプロパティーをもつ文字列は、特別な入力構文とプリント構文を使用します。

#("characters" property-data...)

ここでproperty-dataは3個でグループ化された、0個以上の要素から構成されます:

beg end plist

要素begおよびendは整数で、文字列内のインデックスの範囲を指定します。plistはその範囲にたいするプロパティーリストです。たとえば、

#("foo bar" 0 3 (face bold) 3 4 nil 4 7 (face italic))

これはテキスト内容が‘foo bar’で、最初の3文字はfaceプロパティーに値boldをもち、最後の3文字はfaceプロパティーに値italicをもつことを表します。(4番目の文字にはテキストプロパティーはないので、プロパティーリストはnilです。実際には、範囲の中の指定されていない文字はデフォルトではプロパティーをもたないので、範囲のプロパティーリストをnilと指定する必要ありません)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.9 Vector Type

ベクター(vector)は、任意の型の要素からなる1次元の配列です。ベクター内の任意の要素へのアクセスに要す時間は、一定です(リストの場合、要素へのアクセスに要す時間は、リストの先頭からその要素までの距離に比例します)。

ベクターのプリント表現は、左角カッコ(left square bracket)、要素、右角カッコ(right square bracket)から構成されます。これは入力構文でもあります。数字や文字列と同様に、ベクターは評価において定数と判断されます。

[1 "two" (three)]      ; 3要素のベクター。
     ⇒ [1 "two" (three)]

ベクターに作用する関数については、Vectorsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.10 Char-Table Type

文字テーブル(char-table)は、任意の型の要素をもつ1次元の配列で、文字コードによりインデックスづけされます。文字テーブルは、文字コードに情報を割り当てることを必要とする多くの処理を簡単にするための、特別な追加の機能をもちます — たとえば、文字テーブルは、継承するための親、デフォルト値、特別な目的のために使用する少数の余分なスロットをもつことができます。文字テーブルは、文字セット全体にたいして1つの値を指定することもできます。

文字テーブルのプリント表現はベクターと似ていますが、最初に余分な‘#^’があります1

文字テーブルを操作する特別な関数については、Char-Tablesを参照してください。文字テーブルの使用には以下が含まれます:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.11 Bool-Vector Type

ブールベクター(bool-vector)は、要素がtnilでなければならない、1次元の配列です。

ブールベクターのプリント表現は文字列と似ていますが、後に長さを記述した‘#&’で始まります。これに続く文字列定数は、ビットマップとして実際に内容を指定するブールベクターです — 文字列定数内のそれぞれの“文字”は8ビットを含み、これはブールベクターの次の8要素を指定します(1はt、0はnilです)。文字の最下位ビットブールベクターの最下位のインデックスに対応します。

(make-bool-vector 3 t)
     ⇒ #&3"^G"
(make-bool-vector 3 nil)
     ⇒ #&3"^@"

C-g’の2進コードは111、‘C-@’はコード0の文字なので、この結果は道理にかなっています。

長さが8の倍数でない場合、プリント表現には余分な要素が表示されますが、これらの余分な要素に意味はありません。たとえば以下の例では、最初の3ビットだけが使用されるので、2つのブールベクターは等価です:

(equal #&3"\377" #&3"\007")
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.12 Hash Table Type

ハッシュテーブルは非常に高速な照合テーブルの一種で、キーを対応する値にマップするalistと似ていますが、より高速です。ハッシュテーブルのプリント表現、以下のようにハッシュテーブルのプロパティーと内容を指定します:

(make-hash-table)
     ⇒ #s(hash-table size 65 test eql rehash-size 1.5
                             rehash-threshold 0.8 data ())

ハッシュテーブルについての詳細な情報は、Hash Tablesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.13 Function Type

他のプログラミング言語の関数と同様に、Lisp関数は実行可能なコードです。他の言語とは異なり、Lispの関数はLispオブジェクトでもあります。Lispのコンパイルされていない関数はラムダ式 — つまり1番目の要素がシンボルlambdaであるリストです(Lambda Expressionsを参照してください)。

ほとんどのプログラミング言語では、名前のないの関数はありません。Lispでは、関数に本質的な名前はありません。名前がなくても、ラムダ式を関数として呼び出すことができます。これを強調するために、わたしたちはこれを無名関数(anonymous function)とも呼びます(Anonymous Functionsを参照してください)。Lispの名前つき関数は、関数セルに有効な関数がセットされた単なるシンボルです(Defining Functionsを参照してください)。

ほとんどの場合、関数はLispプログラム内のLisp式に名前が記述されたところで呼び出されます。しかし、実行時に関数オブジェクトを構築または取得してから、基本関数funcallおよびapplyにより呼び出すことができます。Calling Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.14 Macro Type

Lispマクロ(Lisp macro)は。Lisp言語を拡張する、ユーザー定義の構成です。これはオブジェクトとしてではなく関数のように表現されますが、引数の渡し方の意味が異なります。Lispマクロの形式はリストです。これは、最初の要素がmacroで、(lambdaシンボルを含む)CDRがLisp関数オブジェクトであるようなリストです。

Lispマクロオブジェクトは通常、ビルトインのdefmacro関数で定義されますが、macroで始まる任意のリストも、Emacsにとってはマクロです。マクロを記述する方法の説明は、Macrosを参照してください。

警告: Lispマクロとキーボードマクロ(Keyboard Macrosを参照してください)は、完全に別物です。修飾なしで“マクロ”という単語を使用したときは、キーボードマクロではなく、Lispマクロのことを指します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.15 Primitive Function Type

基本関数(primitive function)とは、Cプログラミング言語で記述された、Lispから呼び出せる関数です。基本関数はsubrsビルと陰関数(built-in functions)とも呼ばれます(単語“subr”は、“サブルーチン(subroutine)”が由来です)。ほとんどの基本関数、呼び出されたとき、すべての引数を評価します。すべての引数を評価しない基本関数は、スペシャルフォーム(special form)と呼ばれます(Special Formsを参照してください)。

呼び出す側からすれば、その関数が基本関数かどうかは、問題になりません。しかし、基本関数をLispで記述された関数で再定義した場合は、問題になります。理由は、その基本関数がCコードから直接呼び出されているかもしれないからです。Lispから再定義した関数を呼び出すと、これは新しい定義を使用するでしょうが、Cコードから呼び出すと、ビルトインの定義が使用されるでしょう。したがって、基本関数の再定義はしないでください

関数(function)という用語により、LispやCで記述された、すべてのEmacs関数を参照します。Lispで記述された関数についての情報は、Function Typeを参照してください。

基本関数に入力構文はなく、サブルーチン名とともにハッシュ表記でプリントします。

(symbol-function 'car)          ; そのシンボルの関数セルに
                                ;     アクセスします。
     ⇒ #<subr car>
(subrp (symbol-function 'car))  ; これは基本関数か?
     ⇒ t                ;    イェース。

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.16 Byte-Code Function Type

バイトコード関数オブジェクト(byte-code function objects)は、Lispコードをバイトコンパイルすることにより生成されます(Byte Compilationを参照してください)。内部的には、バイトコード関数オブジェクトは、ベクターによく似ています。しかしバイトコード関数オブジェクトが関数呼び出しのように見える場合、評価プロセスにより、このデータ型は特別に処理されます。Byte-Code Function Objectsを参照してください。

バイトコード関数オブジェクトのプリント表現と入力構文は、ベクターのものと似ていますが、開き角カッコ‘[’の前に‘#’があります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.17 Autoload Type

autoloadオブジェクト(autoload object)は、最初の要素がシンボルautoloadのリストです。これはシンボルの関数定義として保存され、実際の定義にたいする代替としての役割をもちます。autoloadオブジェクトは、必要な時にロードされるLispコードファイルのなかで、実際の定義を見つけることができることを宣言します。これにはファイル名と、加えて実際の定義についての他のいくつかの情報が含まれます。

ファイルがロードされた後、そのシンボルは、autoloadオブジェクトではない、新しい関数定義をもつはずです。新しい定義は、最初からそこにあったかのように呼び出されます。ユーザーの観点からは、関数呼び出しは期待された動作、つまりロードされたファイル内の関数定義を使用します。

autoloadオブジェクトは通常、シンボルの関数セルにオブジェクトを保存する、関数autoloadにより作成されます。詳細は、Autoloadを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4 Editing Types

前のセクションの型は一般的なプログラミングの目的のために使用され、これらのほとんどは、ほとんどのLisp方言で一般的です。Emacs Lispは、編集に関する目的のために、いくつかの追加のデータ型を提供します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.1 Buffer Type

バッファー(buffer)とは、編集されるテキストを保持するオブジェクトです(Buffersを参照してください)。ほとんどのバッファーはディスクファイル(Filesを参照してください)の内容を保持するので、それらは編集できますが、他の目的のために使用されるものもいくつかあります。ほとんどのバッファーは、ユーザーにより閲覧されることも意図しているので、いつかはウィンドウ内(Windowsを参照してください)に表示されます。しかしバッファーはウィンドウに表示される必要はありません。バッファーはそれぞれ、ポイント(point)と呼ばれる位置指定をもちます(Positionsを参照してください)。ほとんどの編集コマンドは、カレントバッファー内のポイントに隣接する内容を処理します。常に1つのバッファーがカレントバッファー(current buffer)です。

バッファーの内容は文字列によく似ていますが、バッファーはEmacs Lispの文字列と同じようには使用されず、利用可能な操作は異なります。文字列にテキストを“挿入”するためには、部分文字列の結合が必要で、結果は完全に新しい文字列オブジェクトなのに比べて、バッファーでは既存のバッファーに効率的にテキストを挿入して、バッファーの内容を変更できます。

標準的なEmacs関数の多くは、カレントバッファー内の文字を操作したりテストするためのものです。このマニュアルには、これらの関数の説明のために、1つのチャプターをあてています(Textを参照してください)。

他のデータ構造のいくつかは、各バッファーに関連付けられています:

ローカルキーマップと変数リストは、具ローマルナバインディングや値を個別にオーバーライドするためのエントリーを含みます。これらは、実際にプログラムを変更することなく、異なるバッファーでのプログラムの振る舞いをカスタマイズするために使用されます。

バッファーはインダイレクト(indirect: 間接) — つまり他のバッファーとテキストを共有するが、それぞれ別に表示する — かもしれません。Indirect Buffersを参照してください。

バッファーに入力構文はありません。バッファーはバッファー名を含むハッシュ表記でプリントされます。

(current-buffer)
     ⇒ #<buffer objects.texi>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.2 Marker Type

マーカー(marker)は、特定のバッファー内の位置を表します。したがってマーカーには2つの内容 — 1つはバッファー、もう1つは位置 — をもちます。バッファーのテキストの変更では、マーカーが常にバッファー内の同じ2つの文字の間に位置することを確実にするために、必要に応じて自動的に位置の値が再配置されます。

マーカーは入力構文をもちません。マーカーは、カレントの文字位置と、そのバッファー名を与える、ハッシュ表記でプリントされます。

(point-marker)
     ⇒ #<marker at 10779 in objects.texi>

マーカーのテスト、作成、コピー、移動の方法についての情報は、Markersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.3 Window Type

ウィンドウ(window)はEmacsがバッファーを表示するために使用する端末スクリーンの部分を記述します。すべてのウィンドウは関連付けられた1つのバッファーをもち、バッファーの内容はそのウィンドウに表示されます。対照的に、あるバッファーは、1つのウィンドウに表示されるか、ウィンドウに表示されないか、それとも複数のウィンドウに表示されるかもしれません。

同時に複数のウィンドウが存在するかもしれませんが、常に1つのウィンドウが選択されたウィンドウ(selected window)になります。Emacsがコマンドにたいして準備できているときに、(通常は)カーソルが表示されるウィンドウが、選択されたウィンドウです。選択されたウィンドウは通常、カレントバッファーを表示しますが、これは必須ではありません。

スクリーン上でウィンドウはフレームにグループ化されます。各ウィンドウは、ただ1つだけのフレームに属します。Frame Typeを参照してください。

ウィンドウは入力構文をもちません。ウィンドウは、ウィンドウ番号、表示されているバッファー名を与える、ハッシュ表記でプリントされます。与えられたウィンドウに表示されるバッファーは頻繁に変更されるかもしれないので、一意にウィンドウを識別するためにウィンドウ番号が存在します。

(selected-window)
     ⇒ #<window 1 on objects.texi>

ウィンドウに作用する関数の説明は、Windowsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.4 Frame Type

フレーム(frame)とは、1つ以上のEmacsウィンドウを含むスクリーン領域です。スクリーン領域を参照するためにEmacsが使用するLispオブジェクトを指す場合も、“フレーム”という用語を使用します。

フレームは入力構文をもちません。フレームはフレームのタイトル、(フレームを一意に識別するのに便利な)メモリー内のアドレスを与えるハッシュ表記でプリントされます。

(selected-frame)
     ⇒ #<frame emacs@psilocin.gnu.org 0xdac80>

フレームに作用する関数の説明は、Framesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.5 Terminal Type

端末(terminal)は、1つ以上のEmacsフレーム(Frame Typeを参照してください)を表示する能力があるデバイスです。

端末は入力構文をもちません。端末は、その端末の順序番号、TTYデバイスファイル名を与える、ハッシュ表記でプリントされます。

(get-device-terminal nil)
     ⇒ #<terminal 1 on /dev/tty>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.6 Window Configuration Type

ウィンドウ構成(window configuration)は、フレーム内のウィンドウの位置、サイズ、内容についての情報を保持します。これにより後で同じウィンドウ配置を再作成できます。

ウィンドウ構成は入力構文をもちません。ウィンドウ構成のプリント表現は、‘#<window-configuration>’のようになります。ウィンドウ構成に関連するいくつかの関数の説明は、Window Configurationsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.7 Frame Configuration Type

フレーム構成(frame configuration)は、すべてのフレーム内のウィンドウの位置、サイズ、内容についての情報を保持します。これは基本型ではありません — 実際のところ、これはCARframe-configurationで、CDRがalistのリストです。各alist要素は、その要素のCARに示される1つのフレームを記述します。

フレーム構成に関連するいくつかの関数の説明は、Frame Configurationsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.8 Process Type

単語プロセス(process)は通常、実行中のプログラムを意味します。Emacs自身はこの種のプロセス内で実行されます。しかしEmacs Lispでは、プロセスとはEmacsプロセスにより作成されたサブプロセスを表す、Lispオブジェクトです。シェル、GDB、ftp、コンパイラーなどのプログラムは、Emacsのサブプロセスとして実行され、Emacsの能力を拡張します。さらに操作を行なうために、Emacsサブプロセスは、Emacsからテキスト入力を受け取り、テキスト出力をEmacsにreturnします。Emacsは、サブプロセスにシグナルを送ることもできます。

プロセスオブジェクトは入力構文をもちません。プロセスオブジェクトは、プロセス名を与えるハッシュ表記でプリントされます。

(process-list)
     ⇒ (#<process shell>)

プロセスの作成、削除、プロセスに関する情報のreturn、入力やシグナルの送信、出力の受信を行なう関数についての情報は、Processesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.9 Stream Type

ストリーム(stream)とは、文字のソースまたはシンクとして — つまり入力として文字を供給したり、出力として文字を受け入れるために使用できるオブジェクトです。多くの異なるタイプ — マーカー、バッファー、文字列、関数を、この方法で使用できます。ほとんどの場合、入力ストリーム(文字列ソース)は、キーボード、バッファー、ファイルから文字を受け取り、出力ストリーム(文字シンク)は文字を*Help*バッファーのようなバッファー、エコーエリアに文字を送ります。

オブジェクトnilは、他の意味に加えて、ストリームとして使用されることがあります。nilは変数standard-inputstandard-outputの値を表します。オブジェクトtも、入力としてミニバッファー(Minibuffersを参照してください)、出力としてエコーエリア(The Echo Areaを参照してください)の使用を指定するストリームになります。

ストリームは特別なプリント表現や入力構文をもたず、何であれ、それらの基本型としてプリントされます。

パース関数およびプリント関数を含む、ストリームに関連した関数の説明は、Reading and Printing Lisp Objectsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.10 Keymap Type

キーマップ(keymap)は、ユーザーがタイプした文字を、コマンドにマップします。このマップは、ユーザーのコマンド入力が実行される方法を制御します。キーマップは、実際にはCARがシンボルkeymapのリストです。

キーマップの作成、プレフィクスキーの処理、ローカルキーマップやグローバルキーマップ、キーバインドの変更についての情報は、Keymapsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.11 Overlay Type

オーバーレイ(overlay)は、バッファーの一部に適用するプロパティーを指定します。それぞれのオーバーレイはバッファーの指定された範囲に適用され、プロパティーリスト(プロパティー名と値が交互に記述された要素のリスト)を含みます。オーバーレイプロパティーは、バッファーの指定された一部を、一時的に異なるスタイルで表示するために使用されます。オーバーレイは入力構文をもたず、バッファーメイト範囲の位置を与えるハッシュ表記でプリントされます。

オーバーレイを作成したり使用する方法についての情報は、Overlaysを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.12 Font Type

fontは、グラフィカルな端末上のテキストを表示する方法を指定します。実際には異なる3つのフォント型 — フォントオブジェクト(font objects)フォントスペック(font specs)フォントエンティティー(font entities) — が存在しますこれらは入力構文をもちません。これらのプリント構文は、‘#<font-object>’、‘#<font-spec>’、‘#<font-entity>’のようになります。これらのLispオブジェクトの説明は、Low-Level Font Representationを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.5 Read Syntax for Circular Objects

複雑なLispオブジェクトにおける共有された構造、または循環する構造を表すために、リーダー構成‘#n=’と‘#n#’を使用することができます。

後でオブジェクトを参照するには、オブジェクトの前で#n=を使用します。その後で、他の場所にある同じオブジェクトを参照するために、#n#を使用することができます。ここでnは任意の整数です。たとえば以下は、1番目の要素が3番目の要素にも繰り替えされるリストを作成する方法です:

(#1=(a) b #1#)

これは、以下のような通常の構文とは異なります

((a) b (a))

これは1番目の要素と3番目の要素がそっくりなリストですが、これらは同じLispオブジェクトではありません。以下で違いを見ることができます:

(prog1 nil
  (setq x '(#1=(a) b #1#)))
(eq (nth 0 x) (nth 2 x))
     ⇒ t
(setq x '((a) b (a)))
(eq (nth 0 x) (nth 2 x))
     ⇒ nil

“要素”として自身を含むような、循環する構造を作成するために、同じ構文を使用できます。以下は例です:

#1=(a #1#)

これは、2番目の要素がそのリスト自身であるリストを作成します。これが実際にうまくいくのか、以下で確認できます:

(prog1 nil
  (setq x '#1=(a #1#)))
(eq x (cadr x))
     ⇒ t

変数print-circleを非nil値にバインドした場合、Lispプリンターは、循環および共有されるLispオブジェクトを記録するこの構文を、生成することができます。Variables Affecting Outputを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6 Type Predicates

Emacs Lispインタープリター自身は、関数が呼び出されたときに、その関数に渡された実際の引数にたいする型チェックは行ないません。それが行なえないのは、Lispにおける関数の引数は、他のプログラミング言語のようなデータ型宣言をもたないからです。したがって実際の引数が、その関数が使用できる型に属するかどうかをテストするのは、それぞれの関数に任されています。

すべてのビルトイン関数は、適切なときに実際の引数の型チェックを行い、引数の型が違う場合は、wrong-type-argumentエラーをシグナルします。たとえば以下は、+の引数に、+が扱うことができない引数を渡したとき何が起こるかの例です:

(+ 2 'a)
     error→ Wrong type argument: number-or-marker-p, a

異なる型にたいして異なる処理をプログラムに行なわせる場合は、明示的に型チェックを行なわなければなりません。オブジェクトの型をチェックするもっとも一般的な方法は、型述語(type predicate)関数の呼び出しです。Emacsはそれぞれの型にたいする型述語をもち、組み合わされた型にたいする述語もあります。

型述語関数は1つの引数をとり、その引数が適切な型であればt、そうでない場合はnilをreturnします。述語関数にたいする一般的なLisp慣習にしたがい、ほとんどの型述語の名前は、‘p’で終わります。

以下はリストにたいしてチェックを行なう述語listpと、シンボルにたいしてチェックを行なう述語symbolpの例です。

(defun add-on (x)
  (cond ((symbolp x)
         ;; If X is a symbol, put it on LIST.
         (setq list (cons x list)))
        ((listp x)
         ;; If X is a list, add its elements to LIST.
         (setq list (append x list)))
        (t
         ;; We handle only symbols and lists.
         (error "Invalid argument %s in add-on" x))))

以下の表は、事前定義された型述語(アルファベット順)と、さらに情報を得るためのリファレンスです。

atom

atomを参照してください。

arrayp

arraypを参照してください。

bool-vector-p

bool-vector-pを参照してください。

bufferp

bufferpを参照してください。

byte-code-function-p

byte-code-function-pを参照してください。

case-table-p

case-table-pを参照してください。

char-or-string-p

char-or-string-pを参照してください。

char-table-p

char-table-pを参照してください。

commandp

commandpを参照してください。

consp

conspを参照してください。

custom-variable-p

custom-variable-pを参照してください。

display-table-p

display-table-pを参照してください。

floatp

floatpを参照してください。

fontp

Low-Level Font Representationを参照してください。

frame-configuration-p

frame-configuration-pを参照してください。

frame-live-p

frame-live-pを参照してください。

framep

framepを参照してください。

functionp

functionpを参照してください。

hash-table-p

hash-table-pを参照してください。

integer-or-marker-p

integer-or-marker-pを参照してください。

integerp

integerpを参照してください。

keymapp

keymappを参照してください。

keywordp

Variables that Never Changeを参照してください。

listp

listpを参照してください。

markerp

markerpを参照してください。

wholenump

wholenumpを参照してください。

nlistp

nlistpを参照してください。

numberp

numberpを参照してください。

number-or-marker-p

number-or-marker-pを参照してください。

overlayp

overlaypを参照してください。

processp

processpを参照してください。

sequencep

sequencepを参照してください。

stringp

stringpを参照してください。

subrp

subrpを参照してください。

symbolp

symbolpを参照してください。

syntax-table-p

syntax-table-pを参照してください。

vectorp

vectorpを参照してください。

window-configuration-p

window-configuration-pを参照してください。

window-live-p

window-live-pを参照してください。

windowp

windowpを参照してください。

booleanp

booleanpを参照してください。

string-or-null-p

string-or-null-pを参照してください。

あるオブジェクトがどの型かチェックするもっとも一般的な方法は、関数type-ofの呼び出しです。オブジェクトは、ただ1つだけの基本型に属することを思い出してください。type-ofは、それがどの型(Lisp Data Typesを参照してください)か告げます。しかしtype-ofは基本型以外の型については何も知りません。ほとんどの場合、type-ofより型述語を使用するほうが便利でしょう。

Function: type-of object

この関数はobjectの基本型を名前とする、シンボルをreturnします。retuen値はシンボルbool-vectorbufferchar-tablecompiled-functionconsfloatfont-entityfont-objectfont-specframehash-tableintegermarkeroverlayprocessstringsubrsymbolvectorwindowwindow-configurationのうちの1つです。

(type-of 1)
     ⇒ integer
(type-of 'nil)
     ⇒ symbol
(type-of '())    ; ()nilです。
     ⇒ symbol
(type-of '(x))
     ⇒ cons

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.7 Equality Predicates

ここでは、2つのオブジェクトの同一性をテストする関数を説明します。(たとえば文字列などの)特定の型のオブジェクト同士で、内容の同一性をテストするのは、別の関数を使用します。これらの述語にたいしては、そのデータ型を説明する、適切なチャプターを参照してください。

Function: eq object1 object2

この関数はobject1object2が同じオブジェクトの場合はt、それ以外はnilをreturnします。

object1object2が、同じ値をもつ整数の場合、これらは同じオブジェクトと判断されます(eqtをreturnします)。object1object2が、同じ名前のシンボルの場合、通常は同じオブジェクトです。しかし例外もあります。Creating and Interning Symbolsを参照してください。(リスト、ベクター文字列などの)他の型にたいしては、同じ内容(または要素)の2つの引数が、両者eqである必要はありません。これらが同じオブジェクトの場合だけeqであり、その場合は、一方の内容を変更すると、もう一方の内容にも同じ変更が反映されます。

(eq 'foo 'foo)
     ⇒ t
(eq 456 456)
     ⇒ t
(eq "asdf" "asdf")
     ⇒ nil
(eq "" "")
     ⇒ t
;; この例外は省スペースのためにEmacs Lispが
;; ただ1つのマルチバイトの空文字列を作成するためです。
(eq '(1 (2 (3))) '(1 (2 (3))))
     ⇒ nil
(setq foo '(1 (2 (3))))
     ⇒ (1 (2 (3)))
(eq foo foo)
     ⇒ t
(eq foo '(1 (2 (3))))
     ⇒ nil
(eq [(1 2) 3] [(1 2) 3])
     ⇒ nil
(eq (point-marker) (point-marker))
     ⇒ nil

make-symbol関数は、internされていないシンボルをreturnします。これはLisp式内で、その名前を記述したシンボルとは区別されます。同じ名前の、異なるシンボルは、eqではありません。Creating and Interning Symbolsを参照してください。

(eq (make-symbol "foo") 'foo)
     ⇒ nil
Function: equal object1 object2

この関数は、object1object2が同じ構成要素をもつ場合はt、それ以外はnilをreturnします。eqは引数が同じオブジェクトなのかテストするのにたいして、equalは同一でない引数の内部を調べて、それらの要素または内容が同一化をテストします。したがって2つのオブジェクトがeqならば、それらはequalです。しかし、その逆は常に真ではありません。

(equal 'foo 'foo)
     ⇒ t
(equal 456 456)
     ⇒ t
(equal "asdf" "asdf")
     ⇒ t
(eq "asdf" "asdf")
     ⇒ nil
(equal '(1 (2 (3))) '(1 (2 (3))))
     ⇒ t
(eq '(1 (2 (3))) '(1 (2 (3))))
     ⇒ nil
(equal [(1 2) 3] [(1 2) 3])
     ⇒ t
(eq [(1 2) 3] [(1 2) 3])
     ⇒ nil
(equal (point-marker) (point-marker))
     ⇒ t
(eq (point-marker) (point-marker))
     ⇒ nil

文字列の比較は大文字小文字を区別しますが、テキストプロパティーは考慮しません — これは文字列内の文字だけを比較します。Text Propertiesを参照してください。テキストプロパティーも比較する場合は、equal-including-propertiesを使用します。記述的な理由により、ユニバイト文字列とマルチバイト文字列は、それらが同じ文字シーケンスを含み、それらすべてのコードが0から127(ASCII)、または160から255(8ビットグラフィック)の場合に限り、equalです(Text Representationsを参照してください)。

(equal "asdf" "ASDF")
     ⇒ nil

しかし2つの別のバッファーは、それらのテキスト内容が同じでも、equalと判断されることはありません。

equalのテストは再帰により実装されています。たとえば2つのコンスセルxyを与えると、(equal x y)は、以下の式の両方がtをreturnする場合に限り、tをreturnします:

(equal (car x) (car y))
(equal (cdr x) (cdr y))

これは再帰処理なので、循環するリストがあると無限再帰となります(エラーとなります)。

Function: equal-including-properties object1 object2

この関数はすべてのケースにおいてequalと同様に振る舞いますが、2つの文字列がequalになるためには、それらが同じテキストプロパティーをもつ必要があります。

(equal "asdf" (propertize "asdf" 'asdf t))
     ⇒ t
(equal-including-properties "asdf"
                            (propertize "asdf" 'asdf t))
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3 Numbers

GNU Emacsは2つの数値データ型 — 整数(integers)浮動小数点数(floating-point numbers)をサポートします。整数は-3、0、7、13、511などの整数です。浮動小数点数は-4.5、0.0、2.71828などの小数部をもちます・これらは指数記数法でも表現できます — ‘1.5e2’は‘150.0’と同じです。ここで‘e2’は10の2乗をあらわし、それに1.5を乗じるという意味です。整数計算は正確であり、オーバーフローするときもあります。浮動小数点数の計算においては、数値は固定された精度をもつため、、しばしば丸め誤差(rounding errors)を引き起こします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1 Integer Basics

整数の値の範囲はマシンに依存します。最小の範囲は-536,870,912から536,870,911(30ビット長の -2**29 から 2**29 - 1) ですが、多くのマシンはこれより広い範囲を提供します。このチャプターの例の多くは、最小の整数は30ビット長であると仮定します。

Lispリーダーは、(オプションで最初の符号記号と、最後のピリオドをともなう)数字のシーケンスとして整数を読み取ります。Emacsの範囲を超える整数は、浮動小数点数として扱われます。

 1               ; 整数1。
 1.              ; 整数1。
+1               ; これも整数1。
-1               ; 整数-1。
 9000000000000000000
                 ; 浮動小数点数9e18.
 0               ; 整数0
-0               ; 整数0

基数が10以外の整数の構文は、‘#’の後に基数を指定する文字 — 2進は‘b’、8進は‘o’、16進は‘x’、‘radixr’は基数radix — を記述します。基数を指定する文字の大文字小文字は区別されません。したがって‘#binteger’はintegerを2進として読み取り、‘#radixrinteger’はintegerを基数radixとして読み取ります。radixに指定できる値は2から36です。たとえば:

#b101100 ⇒ 44
#o54 ⇒ 44
#x2c ⇒ 44
#24r1k ⇒ 44

整数にたいして処理を行なうさまざまな関数、特にビット演算(Bitwise Operations on Integersを参照してください)を理解するためには、数を2進形式で見ることが助けになることがしばしばあります。

30ビットの2進では、10進数の整数5は以下のようになります:

0000...000101 (全部で30ビット)

(‘...’は30ビットのワードを満たすのに充分なビットを意味し、この場合の‘...’は12個の0ビットを意味します。以下の例でも、2進の整数を読みやすくするために、‘...’の表記を使用します)

整数の-1は、以下のようになります:

1111...111111 (全部で30ビット)

-1は30個の1で表現されます(これは2の補数表記と呼ばれます)。

-1から4を減じることにより、負の整数-5が得られます。10進の整数4は、2進では100です。したがって、-5は以下のようになります:

1111...111011 (全部で30ビット)

この実装では、0ビットの2進の最大は、10進の536,870,911です。これは2進では以下のようになります:

0111...111111 (全部で30ビット)

算術関数は整数が範囲の外かをチェックしないので、536,870,911に1を加えると、その値は負の整数-536,870,912になります:

(+ 1 536870911)
     ⇒ -536870912
     ⇒ 1000...000000 (全部で30ビット)

このチャプターで説明する多くの関数は、数字の位置として引数にマーカー(Markersを参照してください)を受け取ります。そのような関数にたいする実際の引数は数字かマーカーなので、わたしたちはこれらの引数にnumber-or-markerという名前を与えることがあります。引数の値がマーカーの場合、マーカーの位置が使用され、マーカーのバッファーは無視されます。

Variable: most-positive-fixnum

この変数の値は、Emacs Lispが扱える整数の最大値です。典型的な値は32ビットでは 2**29 - 1 、64ビットでは 2**61 - 1 です。

Variable: most-negative-fixnum

この変数の値は、Emacs Lispが扱える最小の整数です。これは負の整数です。典型的な値は32ビットでは -2**29 、64ビットでは -2**61、 です。

Emacs Lispでは、テキスト文字は整数により表現されます。0から(max-char)までの整数は、有効な文字として判断されます。Character Codesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2 Floating-Point Basics

浮動小数点数は整数ではない数を表現するのに便利です。浮動小数点数の範囲は、使用しているマシンでのCデータ型のdoubleと同じ範囲です。現在Emacsでサポートされているすべてのコンピューターでは、これは倍精度のIEEE浮動小数点数です。

浮動小数点数にたいする入力構文は、小数点と指数のどちらか1つ、または両方が必要とします。オプションの符号(‘+’か‘-’)は、その数字と指数の前に記述します。たとえば、‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は、値が1500の浮動小数点数を記述する5つの方法です。これらはすべて等価です。Common Lispと同様、Emacs Lispは、浮動小数点数の小数点の後に、少なくとも1つの数字を必要とします。‘1500.’は整数であり、浮動小数点数ではありません。

Emacs Lispは-0.0を、equal=に関して、通常の0と数学的に同じものとして扱います。これは、(他の処理がこれらを区別するとしても、-0.00.0は数学的に等しいとする)IEEE浮動小数点数規格にしたがっています。

IEEE浮動小数点数規格は、浮動小数点数として、正の無限大と、負の無限大をサポートします。この規格はNaNまたは“not-a-number(数字ではない)”と呼ばれる値クラスも提供します。数学関数は、正しい答えが存在しないような場合に、このような値をreturnします。たとえば(/ 0.0 0.0)はNaNをreturnします。NaN値に符号がついていたとしても、実用的な目的にたいして、Emacs Lispにおける異なるNaN値に、意味のある違いはありません。

以下は、これらの特別な浮動小数点数にたいする入力構文です:

infinity

1.0e+INF’と‘-1.0e+INF

not-a-number

0.0e+NaN’と‘-0.0e+NaN

以下の関数は浮動小数点数を扱うために特化したものです:

Function: isnan x

この述語は浮動小数引数がNaNのときはt、それ以外はnilをreturnします。

Function: frexp x

この関数はコンスセル(s . e)をreturnします。ここでseは、浮動小数点数のsignificand(浮動小数点数を2の指数表現したときの仮引数)と指数です。

xが有限の場合、sは0.5以上1.0未満の浮動小数点数で、eは整数で、 x = s * 2**eです。 xが0または無限の場合、sxと等しくなります。xがNaNの場合は、sもNaNです。xが0の場合、eは0です。

Function: ldexp sig &optional exp

この関数は、significandがsig、指数がexpの浮動小数点数をreturnします。

Function: copysign x1 x2

koの関数はx2の、x1の値にコピーして、その結果をreturnします。x1x2は浮動小数でなければなりません。

Function: logb x

この関数はxの2進指数をreturnします。より正確にいうと、この値は|x|の2を底とする対数を、整数に切り下げたものです。

(logb 10)
     ⇒ 3
(logb 10.0e20)
     ⇒ 69

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3 Type Predicates for Numbers

このセクションの関数は、数または数の特定の型にたいしてテストを行ないます。関数integerpおよびfloatpは、引き数として任意のLispオブジェクト型をとることができます(そうでないと、あまり使用する機会がありません)。しかし、述語zeropは、引き数として数を要求します。Predicates on Markersinteger-or-marker-pnumber-or-marker-pも参照してください。

Function: floatp object

この述語は、引数が浮動小数かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: integerp object

この述語は引数が整数かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: numberp object

この述語は引数が数(整数か浮動小数)かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: natnump object

この述語(名前は“natural number(自然数)”が由来です)は、引数が正の整数かどうかをテストして、もしそうならt、それ以外はnilをreturnします。0は整数と判断されます。

wholenumpは、natnumpにたいするシノニムです。

Function: zerop number

この述語は、引数が0かどうかをテストして、もしそうならt、それ以外はnilをreturnします。引数は数でなければなりません。

(zerop x)は、(= x 0)と等価です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4 Comparison of Numbers

数が数値的に等しいかテストするためには、eqではなく、通常は=を使用するべきです。同じ数値をもつ、多くの浮動小数オブジェクトが存在するかもしれません。これらを比較するのにeqを使用する場合、これは2つの値が同じオブジェクトかどうかをテストすることになります。対照的に、=はオブジェクトの数値的な値だけを比較します。

Emacs Lispでは、それぞれの整数はは、一意なLispオブジェクトです。したがって、整数に関しては、eq=と同じです。未知の整数の値を比較するのに、eqを使用するのが便利な場合があります。なぜなら未知の値が数字でない場合でも、eqはエラーを報告しません。対照的に、引数が数でもマーカーでもない場合、=はエラーをシグナルします。しかし、整数の比較においてさえ、使用できる場合は=を使用するのが、よいプログラミング習慣です。

数の比較において、2つの数が同じデータ型(どちらも整数、またはどちらも浮動小数)で、同じ値の場合は等しい数として扱う、equalのほうが便利なときもあります。対照的に、=は、整数と浮動小数点数を等しい数と扱うことができます。Equality Predicatesを参照してください。

他の欠点もあります。浮動小数演算は正確ではないので、浮動小数値を比較するのが悪いアイデアのときが、しばしばあります。通常は、近似的に等しいことをテストするほうがよいでしょう。以下はこれを行なう関数です:

(defvar fuzz-factor 1.0e-6)
(defun approx-equal (x y)
  (or (= x y)
      (< (/ (abs (- x y))
            (max (abs x) (abs y)))
         fuzz-factor)))

Common Lispに関する注意: Common Lispは複数ワード整数を実装していて、2つの別の整数オブジェクトが、同じ数値的な値をもつことができるので、Common Lispでの数の比較は、常に=が要求されます。Emacs Lispの整数は範囲が制限されているため、与えられた値に対応する整数オブジェクトは、1つだけです。

Function: = number-or-marker &rest number-or-markers

この関数は、すべての引数が数値的に等しいかどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: eql value1 value2

この関数はeqと同様に振る舞いますが、引数が両方とも数のときは例外です。これは数を型と数値的な値により比較するので、(eql 1.0 1)nilをreturnしますが、(eql 1.0 1.0)(eql 1 1)tをreturnします。

Function: /= number-or-marker1 number-or-marker2

この関数は引数が数値的に等しいかどうかをテストして、もし異なる場合はt、等しい場合はnilをreturnします。

Function: < number-or-marker &rest number-or-markers

この関数は、各引数がそれぞれ、その後の引数より小さいかどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: <= number-or-marker &rest number-or-markers

この関数は、各引数がそれぞれ、その後の引数以下かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: > number-or-marker &rest number-or-markers

この関数は、各引数がそれぞれ、その後の引数より大きいかどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: >= number-or-marker &rest number-or-markers

この関数は、各引数がそれぞれ、その後の引数以上かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: max number-or-marker &rest numbers-or-markers

この関数は引数の最大をreturnします。引数のどれかが浮動小数の場合は、たとえ最大が整数であっても、浮動小数として値がreturnされます。

(max 20)
     ⇒ 20
(max 1 2.5)
     ⇒ 2.5
(max 1 3 2.5)
     ⇒ 3.0
Function: min number-or-marker &rest numbers-or-markers

この関数は引数の最小をreturnします。引数のどれかが浮動小数の場合は、たとえ最小が整数であっても、浮動小数として値がreturnされます。

(min -4 1)
     ⇒ -4
Function: abs number

この関数はnumberの絶対値をreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.5 Numeric Conversions

整数を浮動少数に変換するには、関数floatを使用します。

Function: float number

これは浮動小数に変換されたnumberをreturnします。すでにnumberが浮動小数の場合、floatはそれを変更せずにreturnします。

浮動小数点数を整数に変換する関数が4つあります。これらは浮動小数点数を丸める方法がことなります。これらはすべて引数numberと、オプション引数としてdivisorを受け取ります。引数は両方とも整数または浮動小数点数です。divisornilのこともあります。divisornilまたは省略された場合、これらの関数はnumberを整数に変換するか、それが既に整数の場合は変更せずにreturnします。divisorが非nilの場合、これらの関数はnumberdivisorで除してから、その結果を整数に変換します。divisorが(整数か浮動小数かに関わらず)0の場合、Emacsはarith-errorエラーをシグナルします。

Function: truncate number &optional divisor

これは0に向かって丸めることにより整数に変換したnumberをreturnします。

(truncate 1.2)
     ⇒ 1
(truncate 1.7)
     ⇒ 1
(truncate -1.2)
     ⇒ -1
(truncate -1.7)
     ⇒ -1
Function: floor number &optional divisor

これは、下方(負の無限大に向かって)に丸めることにより整数に変換したnumberをreturnします。

divisorが指定された場合、modに相当する種類の除算演算を使用して、下方に丸めを行ないます。

(floor 1.2)
     ⇒ 1
(floor 1.7)
     ⇒ 1
(floor -1.2)
     ⇒ -2
(floor -1.7)
     ⇒ -2
(floor 5.99 3)
     ⇒ 1
Function: ceiling number &optional divisor

これは、上方(正の無限大に向かって)に丸めることにより整数に変換したnumberをreturnします。

(ceiling 1.2)
     ⇒ 2
(ceiling 1.7)
     ⇒ 2
(ceiling -1.2)
     ⇒ -1
(ceiling -1.7)
     ⇒ -1
Function: round number &optional divisor

これは、もっとも近い整数に向かって丸めることにより整数に変換したnumberをreturnします。2つの整数から等距離にある値の丸めでは、偶数の整数をreturnします。

(round 1.2)
     ⇒ 1
(round 1.7)
     ⇒ 2
(round -1.2)
     ⇒ -1
(round -1.7)
     ⇒ -2

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.6 Arithmetic Operations

Emacs Lispは伝統的な4つの算術演算(加減乗除)、同様に剰余とmodulusの関数、および1加算、1減算の関数を提供します。%を除き、これらの各関数は引き数として整数か浮動小数を受け取り、浮動小数の引数がある場合は、浮動小数点数をreturnします。

Emacs Lispの算術関数は整数のオーバーフローをチェックしません。したがって(1+ 536870911)は-536870912に評価されるかもしれず、それはハードウェアーに依存します。

Function: 1+ number-or-marker

この関数はnumber-or-marker + 1をreturnします。例えば、

(setq foo 4)
     ⇒ 4
(1+ foo)
     ⇒ 5

この関数はCの演算子++とは類似しません — この関数は変数をインクリメントしません。この関数は和を計算するだけです、したがって以下を続けて評価すると、

foo
     ⇒ 4

変数をインクリメントしたい場合は、以下のようにsetqを使用しなければなりません:

(setq foo (1+ foo))
     ⇒ 5
Function: 1- number-or-marker

この関数はnumber-or-marker - 1をreturnします。

Function: + &rest numbers-or-markers

この関数は引数すべてを加算します。引数を与えない場合、+は0をreturnします。

(+)
     ⇒ 0
(+ 1)
     ⇒ 1
(+ 1 2 3 4)
     ⇒ 10
Function: - &optional number-or-marker &rest more-numbers-or-markers

-関数は2つの目的 — 符号反転と減算 —を果たします。-に1つの引数を与えた場合、値は引数の符号を反転したものになります。複数の引数がある場合、number-or-markerからmore-numbers-or-markersまでの各値を蓄積的に減算します。引数がない場合、結果は0です。

(- 10 1 2 3 4)
     ⇒ 0
(- 10)
     ⇒ -10
(-)
     ⇒ 0
Function: * &rest numbers-or-markers

この関数はすべての引数を乗じて、積をreturnします。引数がない場合、*は1をreturnします。

(*)
     ⇒ 1
(* 1)
     ⇒ 1
(* 1 2 3 4)
     ⇒ 24
Function: / dividend divisor &rest divisors

この関数はdividenddivisorで除し、商をreturnします。追加の引数divisorsがある場合、その後さらにdividenddivisorsで順に除します。各引数は数かマーカーです。

すべての引数が整数の場合、結果は各除算の後に商を0へ向かって丸めることにより得られる整数になります。

(/ 6 2)
     ⇒ 3
(/ 5 2)
     ⇒ 2
(/ 5.0 2)
     ⇒ 2.5
(/ 5 2.0)
     ⇒ 2.5
(/ 5.0 2.0)
     ⇒ 2.5
(/ 25 3 2)
     ⇒ 4
(/ -17 6)
     ⇒ -2

整数を整数0で除すると、Emacsはarith-errorエラー(Errorsを参照してください)をシグナルします。浮動小数の除算においては、0でない数を0で除することにより、正の無限大または負の無限大を得ます(Floating-Point Basicsを参照してください)。

Function: % dividend divisor

この関数は、dividenddivisorで除した後、その剰余を整数でreturnします。引数は整数かマーカーでなければなりません。

任意の2つの整数dividenddivisorにたいして、

(+ (% dividend divisor)
   (* (/ dividend divisor) divisor))

は、divisorが非0の場合は常にdividendと等しくなります。

(% 9 4)
     ⇒ 1
(% -9 4)
     ⇒ -1
(% 9 -4)
     ⇒ 1
(% -9 -4)
     ⇒ -1
Function: mod dividend divisor

この関数はdividenddivisorにたいするmodulo、言い換えるとdividenddivisorで除した後の剰余(ただし符号はdivisorと同じ)えおreturnします。引数は数かマーカーでなければなりません。

%とは異なり、modは浮動小数の引数を許容します。これは商を整数に下方(負の無限大に向かって)へ丸めて、剰余を計算するのにこの商を使用します。

divisorが0のときmodは、両方の引数が整数の場合はarith-errorエラーをシグナルし、それ以外はNaNをreturnします。

(mod 9 4)
     ⇒ 1
(mod -9 4)
     ⇒ 3
(mod 9 -4)
     ⇒ -3
(mod -9 -4)
     ⇒ -1
(mod 5.5 2.5)
     ⇒ .5

任意の2つの数dividenddivisorにたいして、

(+ (mod dividend divisor)
   (* (floor dividend divisor) divisor))

は常にdividendになります(ただし引数のどちらかが浮動小数の場合は丸め誤差の範囲内で等しく、dividendが整数でdivisorが0の場合はarith-errorとなります)。floorについては、Numeric Conversionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.7 Rounding Operations

関数ffloorfceilingfroundftruncateは、浮動小数の引数をとり、値が近くの整数であるような浮動少数をreturnします。ffloorは一番近い下方の整数、fceilingは一番近い上方の整数、ftruncateは0に向かう方向で一番近い整数、froundは一番近い整数をreturnします。

Function: ffloor float

この関数はfloatを次に小さい整数値に丸めて、その値を浮動小数点数としてreturnします。

Function: fceiling float

この関数はfloatを次に大きい整数値に丸めて、その値を浮動小数点数としてreturnします。

Function: ftruncate float

この関数はfloatを0方向の整数値に丸めて、その値を浮動小数点数としてreturnします。

Function: fround float

この関数はfloatを一番近い整数値に丸めて、その値を浮動小数点数としてreturnします。2つの整数値との距離が等しい値にたいする丸めでは、偶数の整数をreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.8 Bitwise Operations on Integers

コンピューターの中では、整数はビット(bit: 0か1の数字)のシーケンスである、2進数で表されます。ビット演算は、そのようなシーケンスの中の個々のビットに作用します。たとえば、シフト(shifting)はシーケンス全体を1つ以上左または右に移動して、“移動された”のと同じパターンを再生します。

Emacs Lispのビット演算は、整数だけに適用されます。

Function: lsh integer1 count

lshlogical shiftの略で、integer1のビットを左にcount個シフトします。countが負の場合は右にシフトし、シフトにより空きになったビットには0がセットされます。count isが負の場合、lshは左端(最上位)に0をシフトするので、integer1が負の場合でも、正の結果が生成されます。これと対照的なのが、以下で説明するashです。

以下に、lshでビットパターンの位置を1つ左にシフトする例を2つ紹介します。ここでは下位8ビットの2進パターンだけを表示しており、残りのビットはすべて0です。

(lsh 5 1)
     ⇒ 10
;; 10進の5は、10進の10になります。
00000101 ⇒ 00001010

(lsh 7 1)
     ⇒ 14
;; 10進の7は、10進の14になります。
00000111 ⇒ 00001110

この例が説明するように、ビットパターンを左に1シフトすると、生成される数は、元の数の2倍になります。

ビットパターンを左に2シフトすると、以下(8ビット2進数)の結果が生成されます:

(lsh 3 2)
     ⇒ 12
;; 10進の3は、10進の12になります。
00000011 ⇒ 00001100

一方、右に1シフトすると、以下のようになります:

(lsh 6 -1)
     ⇒ 3
;; 10進の6は10進の3になります。
00000110 ⇒ 00000011
(lsh 5 -1)
     ⇒ 2
;; 10進の5は、10進の2になります。
00000101 ⇒ 00000010

例が明かにするように、右に1シフトすることにより、正の整数の値が2で除され、下方に丸められます。

関数lshは、他のEmacs Lisp算術関数と同様、オーバーフローをチェックしないので、左にシフトすることにより上位ビットが捨てられ、その数の符号が変化するかもしれません。たとえば30ビットの実装では、536,870,911を左にシフトすると、-2が生成されます。

(lsh 536870911 1)          ; 左シフト
     ⇒ -2

2進では、この引数は以下のようになります:

;; 10進の536,870,911
0111...111111 (全部で30ビット)

これを左にシフトすると、以下のようになります:

;; 10進の-2
1111...111110 (全部で30ビット)
Function: ash integer1 count

ash (算術シフト(arithmetic shift))は、integer1の中のビット位置を左にcountシフトします。countが負の場合は右にシフトします。

ashlshと同じ結果を与えますが、例外はinteger1countがとみに負の場合です。この場合、lshは左にできる空きビットに0を置きますが、ashは1を置きます。

したがってashでビットパターンの位置を右に1シフトすると、以下のようになります:

(ash -6 -1) ⇒ -3
;; 10進の-6は、10進の-3になります
1111...111010 (30 bits total)
     ⇒
1111...111101 (30 bits total)

対照的に、lshでビットパターンの位置を1右にシフトすると、以下のようになります:

(lsh -6 -1) ⇒ 536870909
;; 10進の-6は、10進の536,870,909になります。
1111...111010 (30 bits total)
     ⇒
0111...111101 (30 bits total)

他にも例を示します:

                   ;         30ビットの2進数

(lsh 5 2)          ;   5  =  0000...000101
     ⇒ 20         ;      =  0000...010100
(ash 5 2)
     ⇒ 20
(lsh -5 2)         ;  -5  =  1111...111011
     ⇒ -20        ;      =  1111...101100
(ash -5 2)
     ⇒ -20
(lsh 5 -2)         ;   5  =  0000...000101
     ⇒ 1          ;      =  0000...000001
(ash 5 -2)
     ⇒ 1
(lsh -5 -2)        ;  -5  =  1111...111011
     ⇒ 268435454
                   ;      =  0011...111110
(ash -5 -2)        ;  -5  =  1111...111011
     ⇒ -2         ;      =  1111...111110
Function: logand &rest ints-or-markers

この関数は、引数の“論理積(logical and)”をreturnします。すべての引数のn番目のビットがセットされている場合に限り、結果のn番目のビットがセットされます(“セット”とは、そのビットの値が0ではなく1であることを意味します)。

たとえば、13と12の“論理積”は — 4ビット2進数を使用すると1101と1100の論理積は1100を生成します。この2進数では両方とも、左の2ビットがセット(つまり1)されているので、returnされる値の左2ビットがセットされます。しかし右の2ビットにたいしては、少なくとも1つの引数でそのビットが0なので、returnされる値の右2ビットは0になります。

したがって、

(logand 13 12)
     ⇒ 12

logandに何の引数も綿さない場合は、値-1がreturnされます。-1を2進数で表すとすべてのビットが1なので、-1はlogandにたいする単位元(identity element)です。

                   ;        30ビット2進数

(logand 14 13)     ; 14  =  0000...001110
                   ; 13  =  0000...001101
     ⇒ 12         ; 12  =  0000...001100
(logand 14 13 4)   ; 14  =  0000...001110
                   ; 13  =  0000...001101
                   ;  4  =  0000...000100
     ⇒ 4          ;  4  =  0000...000100
(logand)
     ⇒ -1         ; -1  =  1111...111111
Function: logior &rest ints-or-markers

この関数は、引数の“論理和(inclusive or)”をreturnします。少なくとも1つの引数でn番目のビットがセットされていれば、結果のn番目のビットがセットされます。引数を与えない場合の結果は、この処理にたいする単位元である0です。logiorに渡す引数が1つだけの場合、その引数がreturnされます。

                   ;        30ビット2進数

(logior 12 5)      ; 12  =  0000...001100
                   ;  5  =  0000...000101
     ⇒ 13         ; 13  =  0000...001101
(logior 12 5 7)    ; 12  =  0000...001100
                   ;  5  =  0000...000101
                   ;  7  =  0000...000111
     ⇒ 15         ; 15  =  0000...001111
Function: logxor &rest ints-or-markers

この関数は、引数の“排他的論理和(exclusive or)”をreturnします。n番目のビットがセットされている引数の数が奇数個の場合だけ、結果のn番目のビットがセットされます。引数を与えない場合の結果は、この処理の単位元である0となります。logxorに渡す引数が1つだけの場合、その引数がreturnされます。

                   ;        30ビット2進数

(logxor 12 5)      ; 12  =  0000...001100
                   ;  5  =  0000...000101
     ⇒ 9          ;  9  =  0000...001001
(logxor 12 5 7)    ; 12  =  0000...001100
                   ;  5  =  0000...000101
                   ;  7  =  0000...000111
     ⇒ 14         ; 14  =  0000...001110
Function: lognot integer

この関数は引数の論理的な補数(logical complement)をreturnします。integern番目のビットが0の場合に限り、結果のn番目のビットが1になります。逆も成り立ちます。

(lognot 5)
     ⇒ -6
;;  5  =  0000...000101 (全部で30ビット)
;; becomes
;; -6  =  1111...111010 (全部で30ビット)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.9 Standard Mathematical Functions

これらの数学的関数は、引き数として整数と同様に浮動小数点数も許容します。

Function: sin arg
Function: cos arg
Function: tan arg

これらは三角関数です、引数argはラジアン単位です。

Function: asin arg

(asin arg)の値は、sinの値がargとなるような -pi/2 から pi/2 (境界値を含む)の数です。argが範囲外([-1, 1]の外)の場合、asinはNaNをreturnします。

Function: acos arg

(acos arg)の値は、cosの値がargとなるような、0から pi (境界値を含む)の数です。argが範囲外([-1, 1]の外)の場合、acosはNaNをreturnします。

Function: atan y &optional x

(atan y)の値は、tanの値がyとなるような、 -pi/2 から pi/2 (境界値を含まない)の数です。オプションの第2引数xが与えられた場合、(atan y x)の値はベクトル[x, y]X軸が成す角度のラジアン値です。

Function: exp arg

これは指数関数です。この関数はeの指数argをreturnします。

Function: log arg &optional base

この関数は底をbaseとするargの対数をreturnします。baseを指定しない場合、自然底(natural base)eが使用されます。argまたhbaseが負の場合、logはNaNをreturnします。

Function: expt x y

この関数はxyを乗じてreturnします。引数が両方とも整数で、yが正の場合、結果は整数になります。この場合オーバーフローによる切り捨てが発生するので、注意してください。xが有限の負数で、yが有限の非整数の場合、exptはNaNをreturnします。

Function: sqrt arg

これはargの平方根をreturnします。argが有限で0より小さい場合、sqrtはNaNをreturnします。

加えて、Emacsは以下の数学的な定数を定義します:

Variable: float-e

自然対数e(2.71828…)。

Variable: float-pi

円周率pi(3.14159…)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.10 Random Numbers

決定論的なコンピュータープログラムでは、真の乱数を生成することはできません。しかしほとんどの目的には、疑似乱数(pseudo-random numbers)で充分です。一連の疑似乱数は、決定論的な手法により生成されます。真の乱数ではありませんが、それらにはランダム列を模する特別な性質があります。たとえば疑似ランダム系では、すべての可能な値は、均等に発生します。

疑似乱数は“シード(seed: 種)”から生成されます。与えられた任意のシードから開始することにより、random関数は常に同じ数列を生成します。デフォルトでは、Emacsは開始時に乱数シードを初期化することにより、それぞれのEmacsの実行において、randomの値シーケンスは(ほとんど確実に)異なります。

再現可能な乱数シーケンスが欲しい場合もあります。たとえば乱数シーケンスに依存するプログラムをデバッグする場合、プログラムの各実行において同じ挙動を得ることが助けになります。再現可能なシーケンスを作成するには、(random "")を実行します。これは特定のEmacsの実行可能ファイルにたいして、シードに定数値をセットします(しかし、この実行可能ファイルは、その他のEmacsビルドと異なるものになるでしょう)。シード値として、他のさまざまな文字列を使用することができます。

Function: random &optional limit

この関数は疑似乱数の整数をreturnします。繰り返し呼び出すと、一連の疑似乱数の整数をreturnします。

limitが正の整数の場合、値は負ではないlimit未満の値から選択されます。それ以外では、値はmost-negative-fixnumからmost-positive-fixnumの間の、Lispで表現可能な任意の整数(Integer Basicsを参照してください)になるでしょう。

limittの場合は、Emacsを再起動したときに、新しいシードを選択することを意味します。

limitが文字列の場合、その文字列定数にもとづいた新しいシードを選択することを意味します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4 Strings and Characters

Emacs Lispの文字列は、文字列の順序列(ordered sequence)を含む配列です。文字列はシンボル、バッファー、ファイルの名前に使用されます。その他にも、ユーザーにたいしてメッセージを送ったりバッファー間でコピーする文字列を保持したり等の、他の多くの目的にたいして使用されます。文字列は特に重要なので、Emacs Lispは特別に文字列を操作するための、多くの関数をもちます。Emacs Lispプログラムは、個々の文字より、文字列を多用します。

キーボードの文字イベントの文字列にたいする特別な考慮は、Putting Keyboard Events in Stringsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 String and Character Basics

文字(character)とは、テキスト内の1つの文字を表すLispオブジェクトです。Emacs Lispでは、文字は単なる整数です。ある整数が文字か文字でないかを区別するのは、それが使用される方法だけです。Emacsでの文字表現についての詳細は、Character Codesを参照してください。

文字列(string)とは、固定された文字シーケンスです。これは配列(array)と呼ばれるシーケンス型で、配列長が固定で、1度作成したら変更できないことを意味します(Sequences, Arrays, and Vectorsを参照してください)。Cとは異なり、Emacs Lispの文字列は文字コードを判断することにより終端されません

文字列は配列であり、したがって同様にシーケンスでもあるので、Sequences, Arrays, and Vectorsにドキュメントされている一般的な配列関数やシーケンス関数で、文字列を処理できます。たとえば、文字列内の特定の文字にアクセスしたり変更することができますしかし表示された文字列の幅を計算するために、lengthを使用するべきではないことに注意してください。かわりにstring-widthを使用してください(Size of Displayed Textを参照してください)。

Emacs文字列での非ASCIIにたいすテキスト表現は2つ — ユニバイト(unibyte)とマルチバイト(multibyte)がありますほとんどのLispプログラミングでは、これら2つの表現を気にする必要はありません。詳細は、Text Representationsを参照してください。

キーシーケンスがユニバイト文字列で表されることがあります。ユニバイト文字列がキーシーケンスの場合、範囲128から255までの文字列要素は、範囲128から255の文字コードではなく、メタ文字(これは非常に大きな整数です)を表します。文字列はhyper、super、altで修飾された文字を保持できません。文字列はASCIIコントロール文字を保持できますが、それは他のコントロール文字です。文字列はASCIIコントロール文字の大文字小文字を区別できません。そのような文字をシーケンスに保存したい場合は、文字列ではなくベクターを使用しなければなりません。キーボード入力文字についての情報は、Character Typeを参照してください。

文字列は正規表現を保持するために便利です。string-match (Regular Expression Searchingを参照してください)を使用して、文字列にたいして正規表現をマッチすることもできます。関数match-string (Simple Match Data Accessを参照してください)と、replace-match (see section Replacing the Text that Matched)は、文字列にたいして正規表現をマッチした後に、文字列を分解、変更するのに便利です。

バッファーのように、文字列は文字列内の文字自身と、その文字にたいするテキストプロパティーを含みます。Text Propertiesを参照してください。文字列からバッファーや他の文字列にテキストをコピーする、すべてのLispプリミティブ(Lisp primitives)は、コピーされる文字のプロパティーもコピーします。

文字列を表示したり、バッファーにコピーする関数についての情報は、Textを参照してください。文字または文字列の構文についての情報は、Character TypeString Typeを参照してください。異なるテキスト表現間で変換したり、文字コードをエンコード、デコードする関数については、Non-ASCII Charactersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 Predicates for Strings

一般的なシーケンスや配列にたいする述語についての情報は、Sequences, Arrays, and Vectors、およびArraysを参照してください。

Function: stringp object

この関数はobjectが文字列の場合はt、それ以外はnilをreturnします。

Function: string-or-null-p object

この関数は、objectが文字列またはnilの場合はt、それ以外はnilをreturnします。

Function: char-or-string-p object

この関数は、objectが文字列または文字(たとえば整数)の場合はt、それ以外はnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 Creating Strings

以下の関数は、新たに文字列を作成したり、文字列同士を結合して文字列を作成したり、文字列の一部から文字列を作成する関数です。

Function: make-string count character

この関数は、charactercount回繰り返すことにより作成された文字列をreturnします。countが負の場合は、エラーをシグナルします。

(make-string 5 ?x)
     ⇒ "xxxxx"
(make-string 0 ?x)
     ⇒ ""

この関数に対応する他の関数にはmake-vector (Vectorsを参照してください)、およびmake-list (Building Cons Cells and Listsを参照してください)が含まれます。

Function: string &rest characters

この関数は、文字charactersを含む文字列をreturnします。

(string ?a ?b ?c)
     ⇒ "abc"
Function: substring string start &optional end

この関数は、stringから、インデックスstartの文字(その文字を含む)から、endまでの文字(その文字は含まない)の範囲の文字から構成される、新しい文字列をreturnします。文字列の最初の文字がインデックス0になります。

(substring "abcdefg" 0 3)
     ⇒ "abc"

上記の例では、‘a’のインデックスは0、‘b’のインデックスは1、‘c’のインデックスは2です。インデックス3 — この文字列の4番目の文字 — は、部分文字列がコピーされる文字位置までをマークします。したがって文字列"abcdefg"から、‘abc’がコピーされます。

負のかすは、文字列の最後から数えることを意味するので、-1は文字列の最後の文字のインデックスです。たとえば:

(substring "abcdefg" -3 -1)
     ⇒ "ef"

この例では、‘e’のインデックスは-3、‘f’のインデックスは-2、‘g’のインデックスは-1です。したがって、‘e’と‘f’が含まれ、‘g’は含まれません。

endnilが使用された場合、それは文字列の長さを意味します。したがって、

(substring "abcdefg" -3 nil)
     ⇒ "efg"

引数endを省略した場合、それはnilを指定したのと同じです。(substring string 0)は、stringのすべてをコピーしてreturnします。

(substring "abcdefg" 0)
     ⇒ "abcdefg"

しかし、この目的のためにはcopy-sequenceを推奨します(see section Sequences)。

stringからコピーされた文字がテキストプロパティーをもつ場合、そのプロパティーは新しい文字列へもコピーされます。Text Propertiesを参照してください。

substringの最初の引数にはベクターも指定できます。たとえば:

(substring [a b (c) "d"] 1 3)
     ⇒ [b (c)]

startが整数でない場合、またはendが整数でもnilでもない場合は、wrong-type-argumentエラーがシグナルされます。startendの後の文字を指す場合、またはstringにたいして範囲外の整数をどちらかに指定した場合は、args-out-of-rangeエラーがシグナルされます。

この関数に対応するのはbuffer-substring (Examining Buffer Contentsを参照してください)で、これはカレントバッファー内のテキストの一部を含む文字列をreturnします。文字列の先頭はインデックス0ですが、バッファーの先頭はインデックス1です。

Function: substring-no-properties string &optional start end

これはsubstringと同じようにL機能しますが、値からすべてのテキストプロパティーを破棄します。startを省略したり、nilを指定することができ、この場合0に等しくなります。したがって(substring-no-properties string)は、すべてのテキストプロパティーが削除されたstringのコピーをreturnします。

Function: concat &rest sequences

この関数は、渡された引数内の文字からなる、新しい文字列をreturnします(もしあればテキストプロパティーも)。引数には文字列、数のリスト、数のベクターを指定できます。引数は変更されません。concatに引数を指定しない場合、空文字列をreturnします。

(concat "abc" "-def")
     ⇒ "abc-def"
(concat "abc" (list 120 121) [122])
     ⇒ "abcxyz"
;; nilhあ空のシーケンス。
(concat "abc" nil "-def")
     ⇒ "abc-def"
(concat "The " "quick brown " "fox.")
     ⇒ "The quick brown fox."
(concat)
     ⇒ ""

この関数は常に、任意の既存の文字列にたいしてeqではない、新しい文字列を構築しますが、結果が空文字列の時は例外です(スペースを省くために、Emacsは空のマルチバイト文字列を1つだけ作成します)。

他の結合関数(concatenation functions)についての情報は、Mapping FunctionsmapconcatFunctions for VectorsvconcatBuilding Cons Cells and Listsappendを参照してください。シェルコマンドで使用される文字列の中に、個々のコマンドライン引数を結合するには、combine-and-quote-stringsを参照してください。

Function: split-string string &optional separators omit-nulls trim

この関数は、正規表現separators(Regular Expressionsを参照してください)にもとづいて、stringを部分文字列に分解します。separatorsにたいする各マッチは、分割位置を定義します。分割位置の間にある部分文字列を、リストにまとめてreturnします。

omit-nullsnil(または省略)の場合、連続する2つのseparatorsへのマッチ、またはstringの最初か最後にマッチしたときの空文字列が結果に含まれます。omit-nullstの場合、これらの空文字列は結果から除外されます。

separatorsnil(または省略)の場合、デフォルトはsplit-string-default-separatorsの値になります。

特別なケースとして、separatorsnil(または省略)の場合、常に結果から空文字列が除外されます。したがって:

(split-string "  two words ")
     ⇒ ("two" "words")

結果は、ほとんど有用ではないであろう("" "two" "words" "")という結果ではありません。このような結果が必要な時は、separatorsに明示的な値を使用します:

(split-string "  two words "
              split-string-default-separators)
     ⇒ ("" "two" "words" "")

他にも例を示します:

(split-string "Soup is good food" "o")
     ⇒ ("S" "up is g" "" "d f" "" "d")
(split-string "Soup is good food" "o" t)
     ⇒ ("S" "up is g" "d f" "d")
(split-string "Soup is good food" "o+")
     ⇒ ("S" "up is g" "d f" "d")

空のマッチはカウントされます。例外は、空でないマッチを使用することにより、すでに文字列の最後に到達しているとき、またはstringが空の時で、この場合split-stringは最後の空マッチを探しません。

(split-string "aooob" "o*")
     ⇒ ("" "a" "" "b" "")
(split-string "ooaboo" "o*")
     ⇒ ("" "" "a" "b" "")
(split-string "" "")
     ⇒ ("")

しかし、separatorsが空文字列にマッチできるとき、通常はomit-nullstにすれば、前の3つの例の不明瞭さは、ほとんど発生しません:

(split-string "Soup is good food" "o*" t)
     ⇒ ("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d")
(split-string "Nice doggy!" "" t)
     ⇒ ("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!")
(split-string "" "" t)
     ⇒ nil

空でないマッチより空のマッチを優先するような、一部の“非貪欲(non-greedy)”な値をseparatorsに指定することにより、幾分奇妙(しかし予見可能)な振る舞いが発生する場合があります。繰り返しますが、そのような値は実際にはまれです:

(split-string "ooo" "o*" t)
     ⇒ nil
(split-string "ooo" "\\|o+" t)
     ⇒ ("o" "o" "o")

オプションの引数trimが非nilの場合、その値は各部分文字列の最初と最後からトリムするテキストにマッチする正規表現を指定します。トリムにより、その部分文字列が空になるような場合、それは空文字列として扱われます。

文字列を分割して、call-processstart-processに適した、個々のコマンドライン引数のリストにする必要がある場合は、split-string-and-unquoteを参照してください。

Variable: split-string-default-separators

split-stringseparatorsにたいするデフォルト値です。通常の値は、"[ \f\t\n\r\v]+"です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4 Modifying Strings

既存の文字列の内容を変更するもっとも基本的な方法は、aset (see section Functions that Operate on Arrays)を使用する方法です。(aset string idx char)は、stringのインデックスidxに、charを格納します。それぞれの文字は1文字以上を占有しますが、すでにインデックスの場所にある文字のバイト数が、charが要するバイト数と異なる場合、asetはエラーをシグナルします。

より強力な関数はstore-substringです:

Function: store-substring string idx obj

この関数は、インデックスidxで開始される位置にobjを格納することにより、文字列stringの内容の一部を変更します。objは文字、または(stringより小さい)文字列です。

既存の文字列の長さを変更するのは不可能なので、stringの実際の長さにobjが収まらない場合、またはstringのその位置に現在ある文字のバイト数が、新しい文字に必要なバイト数と異なる場合はエラーになります。

パスワードを含む文字列をクリアーするときは、clear-stringを使用します:

Function: clear-string string

これはstringをユニバイト文字列として、内容を0にクリアーします。これによりstringの長さも変更されるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5 Comparison of Characters and Strings

Function: char-equal character1 character2

この関数は引数が同じ文字を表す場合はt、それ以外はnilをreturnします。case-fold-searchが非nilの場合、この関数は大文字小文字の違いを無視します。

(char-equal ?x ?x)
     ⇒ t
(let ((case-fold-search nil))
  (char-equal ?x ?X))
     ⇒ nil
Function: string= string1 string2

この関数は、2つの文字列の文字が正確にマッチする場合は、tをreturnします。引数にシンボルを指定することもでき、この場合はシンボル名が使用されます。case-fold-searchとは無関係に、大文字小文字は常に意味をもちます。

この関数は、equalで2つの文字列を比較するのと等価です(Equality Predicatesを参照してください)。特に、2つの文字列のテキストプロパティーは無視されます。テキストプロパティーだけが異なる文字列を区別する必要がある場合は、equal-including-propertiesを使用します。しかしequalとは異なり、どちらかの引数が文字列でもシンボルでもない場合、string=はエラーをシグナルします。

(string= "abc" "abc")
     ⇒ t
(string= "abc" "ABC")
     ⇒ nil
(string= "ab" "ABC")
     ⇒ nil

技術的な理由により、ユニバイト文字列とマルチバイト文字列がequalなのは、それらが同じ文字コードのシーケンスを含み、それらすべてのコードが0から127(ASCII)か、160から255(eight-bit-graphic)のときだけです。しかしユニバイト文字列をマルチバイト文字列に変更する際、コードが160から255の範囲にあるすべての文字はより高いコードに変換され、ASCII文字は変換されないまま残ります。したがってユニバイト文字列と、それを変換したマルチバイト文字列は、その文字列のすべてがASCIIのときだけequalです。マルチバイト文字列中で、もし文字コード160から255の文字があったとしても、それは完全に正しいとは言えません。結果として、すべてがASCIIではないユニバイト文字列とマルチバイト文字列がequalであるという状況は、もしかしたらEmacs Lispプロプラマーが直面するかもしれない、とても希少な偽術的に不可解な状況だといえます。Text Representationsを参照してください。

Function: string-equal string1 string2

string-equalstring=に対する別名です。

Function: string< string1 string2

この関数は、2つの文字列を1文字づつ比較します。この関数は、同時に2つの文字列をスキャンして、対応する文字同士がマッチしない最初のペアを探します。2つの文字列内で、小さいほうの文字がstring1の文字の場合、string1が小さいことになり、この関数はtをreturnします。小さいほうの文字がstring2の文字の場合、string1が大きいことになり、この関数はnilをreturnします。2つの文字列が完全にマッチした場合、値はnilになります。

文字のペアは、文字コードで比較されます。ASCII文字セットでは、小文字英字は大文字英字より、高い数値をもつことに留意してください。数字および多くの句読点文字は、大文字英字より低い数値をもちます。ASCII文字は、任意の非ASCII文字より小さくなります。ユニバイト非ASCII文字は、任意のマルチバイト非ASCII文字より、常に小さくなります(Text Representationsを参照してください)。

(string< "abc" "abd")
     ⇒ t
(string< "abd" "abc")
     ⇒ nil
(string< "123" "abc")
     ⇒ t

文字列の長さが異なり、string1の長さまでマッチする場合、結果はtになります。string2の長さまでマッチする場合、結果はnilになります。文字を含まない文字列は、他の任意の文字列より小さくなります。

(string< "" "abc")
     ⇒ t
(string< "ab" "abc")
     ⇒ t
(string< "abc" "")
     ⇒ nil
(string< "abc" "ab")
     ⇒ nil
(string< "" "")
     ⇒ nil

引数としてシンボルを指定することもでき、この場合はシンボルのプリント名が使用されます。

Function: string-lessp string1 string2

string-lesspstring<にたいする別名です。

Function: string-prefix-p string1 string2 &optional ignore-case

この関数は、string1string2のプレフィクス(接頭辞)の場合(たとえばstring2string1で始まる場合)、非nilをreturnします。オプションの引数ignore-caseが非nilの場合、比較において大文字小文字の違いは無視されます。

Function: string-suffix-p suffix string &optional ignore-case

この関数は、suffixstringのサフィックス(接尾辞)の場合(たとえばstringsuffixで終わる場合)、非nilをreturnします。オプションの引数ignore-caseが非nilの場合、比較において大文字小文字の違いは無視されます。

Function: compare-strings string1 start1 end1 string2 start2 end2 &optional ignore-case

この関数は、string1の指定された部分を、string2の指定された部分と比較します。string1の指定された部分とは、インデックスstart1(その文字を含む)から、インデックスend1(その文字を含まない)までです。start1nilを指定すると文字列の最初という意味になり、end1nilを指定すると文字列の長さを意味します同様に、string2の指定された部分とは、インデックスstart2からインデックスend2までです。

文字列は、文字列内の文字の数値により比較されます。たとえば、str1str2は、最初に異なる文字でstr1の文字の数値が小さいときに、“小さい”と判断されます。ignore-caseが非nilの場合、文字は比較を行なう前に小文字に変換されます。比較のためにユニバイト文字列はマルチバイト文字列に変換されるので(Text Representationsを参照してください)、ユニバイト文字列と、それを変換したマルチバイト文字列は、常に等しくなります。

2つの文字列の指定された部分がマッチした場合、値はtになります。それ以外では、値は整数で、これは何文字が一致して、どちらの文字が小さいかを示します。この値の絶対値は、2つの文字列の先頭から一致した文字数に1加えた値になります。string1(または指定された部分)のほうが小さい場合、符号は負になります。

Function: assoc-string key alist &optional case-fold

この関数はassocと同様に機能しますが、keyは文字列かシンボルでなければならず、比較はcompare-stringsを使用して行なわれます。テストする前にシンボルは文字列に変換されます。case-foldが非nilの場合、大文字小文字の違いは無視されます。assocとは異なり、この関数はコンスではない文字列またはシンボルのalist要素もマッチできます。特に、alistは実際のalistではなく、文字列またはリストでも可能です。Association Listsを参照してください。

バッファー内のテキストを比較する方法として、Comparing Textの関数compare-buffer-substringsも参照してください。文字列にたいして正規表現のマッチを行なう関数string-matchも、ある種の文字列比較に使用することができます。Regular Expression Searchingを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.6 Conversion of Characters and Strings

このセクションでは文字、文字列、整数の間で変換を行なう関数を説明します。format (Formatting Stringsを参照してください)、およびprin1-to-string (Output Functionsを参照してください)も、Lispオブジェクトを文字列に変換できます。read-from-string (Input Functionsを参照してください)は、Lispオブジェクトの文字列表現を、オブジェクトに“変換”できます。関数string-to-multibyteおよびstring-to-unibyteは、テキスト表現を文字列に変換します(Converting Text Representationsを参照してください)。

テキスト文字と一般的なインプットイベントにたいするテキスト説明を生成する関数(single-key-descriptionおよびtext-char-description)については、Documentationを参照してください。これらの関数は主にヘルプメッセージを作成するために使用されます。

Function: number-to-string number

この関数はnumberの10進プリント表現からなる文字列をreturnします。引数が負の場合、return値はマイナス記号から開始されます。

(number-to-string 256)
     ⇒ "256"
(number-to-string -23)
     ⇒ "-23"
(number-to-string -23.5)
     ⇒ "-23.5"

int-to-stringは、この関数にたいする半ば廃れた(semi-obsolete)エイリアスです。

Formatting Stringsの関数formatも参照してください。

Function: string-to-number string &optional base

この関数はstring内の文字の数値的な値をreturnします。baseが非nilの場合、値は2以上16以下でなければならず、整数はその基数に変換されます。basenilの場合、基数に10が使用されます。浮動少数の変換は基数が10のときだけ機能します。わたしたちは浮動小数点数にたいして他の基数を実装していません。なえならこれには多くの作業が必要で、その割にその機能が有用には思えないからです。stringが整数のように見えるが、その値がLispの整数に収まらないほど大きな値の場合、string-to-numberは浮動小数の結果をreturnします。

解析ではstringの先頭にあるスペースとタブはスキップして、それから与えられた基数で数字として解釈できるところまでstringを読み取ります(スペースとタブだけではなく、先頭にある他の空白文字を無視するシステムもあります)。stringを数字として解釈できない場合、この関数は0をreturnします。

(string-to-number "256")
     ⇒ 256
(string-to-number "25 is a perfect square.")
     ⇒ 25
(string-to-number "X256")
     ⇒ 0
(string-to-number "-4.5")
     ⇒ -4.5
(string-to-number "1e5")
     ⇒ 100000.0

string-to-intは、この関数にたいする半ば廃れたエイリアスです。

Function: char-to-string character

この関数は、1つの文字characterを含む新しい文字列をreturnします。関数stringのほうがより一般的なので、この関数は半ば廃れています。Creating Stringsを参照してください。

Function: string-to-char string

この関数は、stringの最初の文字をreturnします。これはほとんど(aref string 0)と同じで、例外は文字列が空のときに0をreturnすることです(文字列の最初の文字がASCIIコード0のヌル文字のときも、0をreturnします)。この関数は、残すのに充分なほど有用と思えない場合、将来削除されるかもしれません。

以下は、文字列へ/からの変換に使用できる、その他の関数です:

concat

この関数はベクターまたはリストから文字列に変換します。Creating Stringsを参照してください。

vconcat

この関数は文字列をベクターに変換します。Functions for Vectorsを参照してください。

append

この関数は文字列をリストに変換します。Building Cons Cells and Listsを参照してください。

byte-to-string

この関数は文字データのバイトをユニバイト文字列に変換します。Converting Text Representationsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.7 Formatting Strings

フォーマット(formatting)とは、定数文字列内のなまざまな場所を、計算された値で置き換えることにより、文字列を構築することを意味します。この定数文字列は、他の値がプリントされる方法、同様にどこに表示するかを制御します。これはフォーマット文字列(format string)と呼ばれます。

フォーマットは、表示されるメッセージを計算するために便利なことがしばしばあります。実際に、関数messageおよびerrorは、ここで説明する機能と同じフォーマットを提供します。これらの関数とformatの違いは、フォーマットされた結果を使用する方法だけです。

Function: format string &rest objects

この関数は、stringをコピーしてから、対応するobjectsをエンコードする、コピー内の任意のフォーマット指定(format specification)を置換することにより作成される、新しい文字列をreturnします。引数objectsは、フォーマットされる計算された値です。

string内のフォーマット指定以外の文字は、(もしあれば)テキストプロパティーを含め、出力に直接コピーされます。

フォーマット指定は、‘%’で始まる文字シーケンスです。したがってstring内に‘%d’があれば、formatはそれを、フォーマットされる値の1つ(引数objectsのうちの1つ)にたいするプリント表現で置き換えます。たとえば:

(format "The value of fill-column is %d." fill-column)
     ⇒ "The value of fill-column is 72."

formatは文字‘%’をフォーマット指定と解釈するので、決して最初の引数に不定な文字列(arbitrary string)を渡すべきではありません。これは特に何らかのLispコードにより生成された文字列の場合に当てはまります。その文字列が決して文字‘%’を含まないと確信できないときは、以下で説明するように最初の引数に"%s"を渡して、不定な文字列を2番目の引数として渡します:

  (format "%s" arbitrary-string)

stringに複数のフォーマット指定が含まれる場合、フォーマット指定はobjectsから連続して値を引き当てます。つまり、string内の1番目のフォーマット指定は1番目の値、2番目のフォーマット指定は2番目の値、...を使用します。余分なフォーマット指定(対応する値がない場合)は、エラーとなります。フォーマットされる値が余分にある場合は、無視されます。

ある種のフォーマット指定は、特定の型の値を要求します。その要求に適合しない値を与えた場合、エラーがシグナルされます。

以下は有効なフォーマット指定の表です:

%s

フォーマット指定を、クォートなし(つまりprin1ではなくprincを使用して。Output Functionsを参照してください)の、オブジェクトのプリント表現で置き換えます。したがって、文字列は‘"’文字なしの、文字列内容だけが表示され、シンボルは‘\’文字なしで表されます。

オブジェクトが文字列の場合、文字列のプロパティーは出力にコピーされます。‘%s’のテキストプロパティー自身もコピーされますが、オブジェクトのテキストプロパティーが優先されます。

%S

フォーマット指定を、クォートあり(つまりprin1を使用して。Output Functionsを参照してください)の、オブジェクトのプリント表現で置き換えます。したがって、文字列は‘"’文字で囲まれ、必要となる特別文字の前に‘\’文字が表示されます。

%o

フォーマット指定を8進表現の整数で置き換えます。

%d

フォーマット指定を10進表現の整数で置き換えます。

%x
%X

フォーマット指定を16進表現の整数で置き換えます。‘%x’の場合は小文字、‘%X’の場合は大文字が使用されます。

%c

フォーマット指定を、与えられた値の文字で置き換えます。

%e

フォーマット指定を、浮動小数点数の指数表現で置き換えます。

%f

フォーマット指定を、浮動小数点数にたいする10進少数表記で置き換えます。

%g

フォーマット指定を、指数または10進少数のどちらか短いほうの表記を使用した浮動小数点数で置き換えます。

%%

フォーマット指定を1つの‘%’で置き換えます。このフォーマット指定は、値を使用しません。たとえば、(format "%% %d" 30)"% 30"をreturnします。

他のフォーマット文字は、‘Invalid format operation’エラーになります。

以下にいくつかの例を示します:

(format "The name of this buffer is %s." (buffer-name))
     ⇒ "The name of this buffer is strings.texi."

(format "The buffer object prints as %s." (current-buffer))
     ⇒ "The buffer object prints as strings.texi."

(format "The octal value of %d is %o,
         and the hex value is %x." 18 18 18)
     ⇒ "The octal value of 18 is 22,
         and the hex value is 12."

フォーマット指定はフィールド幅(width)をもつことができ、これは‘%’とフォーマット指定文字(specification character)の間の10進の数字です。そのオブジェクトのプリント表現が、このフィールド幅より少ない文字で構成される場合、formatはパディングしてフィールド幅に拡張します。フォーマット指定‘%%’では、フィールド幅の指定は無視されます。シールド幅指定により行なわれるパディングは通常、左側にスペースを挿入します。

(format "%5d is padded on the left with spaces" 123)
     ⇒ "  123 is padded on the left with spaces"

フィールド幅が小さすぎる場合でも、formatはオブジェクトのプリント表現を切り詰めません。したがって、情報を失う危険を犯すことなく、フィールドの最小幅を指定することができます。以下の2つの例では、‘%7s’は最小幅に7を指定します。1番目の例では、‘%7s’に挿入される文字列は3文字だけなので、4つのブランクスペースによりパディングされます。2番目の例では、文字列"specification"は13文字ですが、切り詰めはされません。

(format "The word `%7s' has %d letters in it."
        "foo" (length "foo"))
     ⇒ "The word `    foo' has 3 letters in it."
(format "The word `%7s' has %d letters in it."
        "specification" (length "specification"))
     ⇒ "The word `specification' has 13 letters in it."

%’の直後、オプションのフィールド幅指定の前に、フラグ文字(flag characters)を置くこともできます。

フラグ‘+’は、正数の前にプラス符号を挿入するので、数には常に符号がつきます。フラグとしてスペースを指定すると、正数の前に1つのスペースが挿入されます(それ以外は、正数は最初の数字から開始されます)。これらのフラグは、正数と負数が同じ列数を使用することを確実にするのに便利です。これらは‘%d’、‘%e’、‘%f’、‘%g’以外では無視され、両方が指定された場合は、‘+’が優先されます。

フラグ‘#’は“代替形式(alternate form)”を指定し。これは使用するフォーマットに依存します。‘%o’にたいしては、結果を‘0’で開始させます。‘%x’と‘%X’にたいしては、結果のプレフィクスは‘0x’または‘0X’になります。‘%e’、‘%f’、‘%g’にたいしては、‘#’フラグは、少数部が0のときも小数点が含まれることを意味します。

フラグ‘0’は、スペースの代わりに文字‘0’でパディングします。このフラグは‘%s’、‘%S’、‘%c’のような、非数値のフォーマット指定文字では無視されます。もれらのフォーマット指定文字で‘0’フラグを指定できますが、それでもスペースでパディングされます。

フラグ‘-’はフィールド幅指定により挿入されるパディングに作用し、もしパディングがある場合、左側ではなく右側にパディングされます。‘-’と‘0’の両方が指定された場合、‘0’フラグは無視されます。

(format "%06d is padded on the left with zeros" 123)
     ⇒ "000123 is padded on the left with zeros"

(format "%-6d is padded on the right" 123)
     ⇒ "123    is padded on the right"

(format "The word `%-7s' actually has %d letters in it."
        "foo" (length "foo"))
     ⇒ "The word `foo    ' actually has 3 letters in it."

すべてのフォーマット指定文字には、その文字の前(フィールド幅がある場合は、その後)に、オプションで精度(precision)を指定できます。精度は小数点‘.’と、その後に桁文字列(digit-string)を指定します。浮動少数のフォーマット指定(‘%e’、‘%f’、‘%g’)では、精度は表示する小数点以下の桁数を指定します。0の場合は小数点も省略されます。‘%s’と‘%S’にたいしては、文字列を精度で指定された幅に切り詰めます。したがって‘%.3s’では、objectにたいするプリント表現の最初の3文字だけが表示されます。他のフォーマット指定文字にたいしては、精度は効果がありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.8 Case Conversion in Lisp

大文字小文字変換関数(character case functions)は、1つの文字または文字列の内容の大文字小文字を変換します。関数は通常、アルファベット文字(英字‘A’から‘Z’と‘a’から‘z’、同様に非ASCIIの英字)だけを変換し、それ以外の文字は変換しません。大文字小文字テーブル(case table。The Case Tableを参照してください)で指定することにより大文字小文字の変換に異なるマッピングを指定できます。

これらの関数は、引数として渡された文字列は変更しません。

以下の例では文字‘X’と‘x’を使用し、これらのASCIIコードは88と120です。

Function: downcase string-or-char

この関数は、string-or-char(文字か文字列)を小文字に変換します。

string-or-charが文字列の場合、この関数は引数の大文字を小文字に変換した、新しい文字列をreturnします。string-or-charが文字の場合、この関数は対応する小文字(正数)をreturnします。元の文字が小文字の場合、または英字でない場合、return値は元の文字と同じです。

(downcase "The cat in the hat")
     ⇒ "the cat in the hat"

(downcase ?X)
     ⇒ 120
Function: upcase string-or-char

この関数は、string-or-char(文字か文字列)を大文字に変換します。

string-or-charが文字列の場合、この関数は引数の小文字を大文字に変換した、新しい文字列をreturnします。string-or-charが文字の場合、この関数は対応する大文字(正数)をreturnします。元の文字が大文字の場合、または英字でない場合、return値は元の文字と同じです。

(upcase "The cat in the hat")
     ⇒ "THE CAT IN THE HAT"

(upcase ?x)
     ⇒ 88
Function: capitalize string-or-char

この関数は文字列または文字をキャピタライズ(capitalize: 先頭が大文字で残りは小文字)します。この関数は、string-or-charが文字列の場合、string-or-charの各単語がキャピタライズされた新しいコピーをreturnします。これは各単語の最初の文字が大文字に変換され、残りは小文字に変換されることを意味します。

単語の定義は、カレント構文テーブル(current syntax table)の単語構成構文クラス(word constituent syntax class)に割り当てられた、連続する文字の任意シーケンスです(Table of Syntax Classesを参照してください)。

string-or-charが文字の場合、この関数はupcaseと同じことを行ないます。

(capitalize "The cat in the hat")
     ⇒ "The Cat In The Hat"
(capitalize "THE 77TH-HATTED CAT")
     ⇒ "The 77th-Hatted Cat"
(capitalize ?x)
     ⇒ 88
Function: upcase-initials string-or-char

この関数は、string-or-charが文字列の場合、string-or-charの中の単語の頭文字をキャピタライズし、頭文字以外の文字は変更しません。この関数は、string-or-charの各単語の頭文字が大文字に変換された新しいコピーをreturnします。

単語の定義は、カレント構文テーブル(current syntax table)の単語構成構文クラス(word constituent syntax class)に割り当てられた、連続する文字の任意シーケンスです(Table of Syntax Classesを参照してください)。

upcase-initialsの引数が文字の場合、upcase-initialsの結果はupcaseと同じになります。

(upcase-initials "The CAT in the hAt")
     ⇒ "The CAT In The HAt"

文字列を比較する関数(大文字小文字の違いを無視するものや、オプションで大文字小文字の違いを無視できるもの)については、Comparison of Characters and Stringsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.9 The Case Table

特別な大文字小文字テーブル(case table)をインストールすることにより、大文字小文字の変換をカスタマイズできます。大文字小文字テーブルは大文字と小文字の間のマッピングを指定します。大文字小文字テーブルはLispオブジェクトにたいする大文字小文字変換関数(前のセクションを参照してください)と、バッファー内のテキストに適用される関数の両方に影響します。それぞれのバッファーには大文字小文字テーブルがあります。新しいバッファーの大文字小文字テーブルを初期化するために使用される、標準の大文字小文字テーブル(standard case table)もあります。

大文字小文字テーブルは、サブタイプがcase-tableの文字テーブル(char-table。Char-Tablesを参照してください)です。この文字テーブルは、それぞれの文字を対応する小文字にマップします。大文字小文字テーブルは、関連するテーブルを保持する、3つの追加スロットをもちます:

upcase

upcase(大文字)テーブルは、それぞれの文字を対応する大文字にマップします。

canonicalize

canonicalize(正準化)テーブルは、大文字小文字に関連する文字セットのすべてを、その文字セットの特別なメンバーにマップします。

equivalences

equivalence(同値)テーブルは、大の字小文字に関連した文字セットのそれぞれを、そのセットの次の文字にマップします。

単純な例では、小文字へのマッピングを指定することだけが必要です。3つの関連するテーブルは、このマッピングから自動的に計算されます。

大文字と小文字が1対1で対応しない言語もいくつかあります。これらの言語では、2つの異なる小文字が、同じ大文字にマップされます。このような場合、大文字と小文字の両方にたいするマップを指定する必要があります。

追加のcanonicalizeテーブルは、それぞれの文字を、正準化された等価文字にマップします。大文字小文字に関連する任意の2文字は、同じ正準等価文字(canonical equivalent character)をもちます。たとえば‘a’と‘A’は大文字小文字変換に関係があるので、これらの文字は同じ正準等価文字(両方の文字が‘a’、または両方の文字が‘A’)をもつべきです。

追加のequivalencesテーブルは、各等価クラスの文字(同じ正準等価文字をもつ文字)を循環的にマップします(通常のASCIIでは、これは‘a’を‘A’に‘A’を‘a’にマップし、他の等価文字セットにたいしても同様にマップします)。

大文字小文字テーブルを構築する際は、canonicalizenilを指定できます。この場合、Emacsは大文字と小文字のマッピングで、このスロットを充填します。equivalencesにたいしてnilを指定することもできます。この場合、Emacsはcanonicalizeから、このスロットを充填します。実際に使用される大文字小文字テーブルでは、これらのコンポーネントは非nilです。canonicalizeを指定せずにequivalencesを指定しないでください。

以下は大文字小文字テーブルに作用する関数です:

Function: case-table-p object

この述語は、objectが有効な大文字小文字テーブルの場合は、非nilをreturnします。

Function: set-standard-case-table table

この関数は、tableを標準大文字小文字テーブルにして、これ以降に作成される任意のバッファーにたいしてこのテーブルが使用されます。

Function: standard-case-table

これは標準大文字小文字テーブル(standard case table)をreturnします。

Function: current-case-table

この関数は、カレントバッファーの大文字小文字テーブルをreturnします。

Function: set-case-table table

これはカレントバッファーの大文字小文字テーブルを、tableにセットします。

Macro: with-case-table table body…

with-case-tableマクロはカレント大文字小文字テーブルを保存してから、tableをカレント大文字小文字テーブルにセットし、その後にbodyフォームを評価してから、最後に大文字小文字テーブルをリストアします。return値は、bodyの最後のフォームの値です。throwまたはエラー(Nonlocal Exitsを参照してください)により異常終了した場合でも、大文字小文字テーブルはリストアされます。

ASCII文字の大文字小文字変換を変更する言語環境(language environment)がいくつかあります。たとえばTurkishの言語環境では、ASCII文字の‘I’にたいする小文字は、Turkishの“dotless i”です。これは、(ASCIIベースのネットワークプロトコル実装のような)ASCIIの通常の大文字小文字変換を要求するコードに干渉する可能性があります。このような場合は、変数ascii-case-tableにたいしてwith-case-tableマクロを使用します。これにより、変更されていないASCII文字セットの大文字小文字テーブルが保存されます。

Variable: ascii-case-table

ASCII文字セットにたいする大文字小文字テーブルです。すべての言語環境セッティングにおいて、これを変更するべきではありません。

以下の3つの関数は、非ASCII文字セットを定義するパッケージにたいして便利なサブルーチンです。これらはcase-tableに指定された大文字小文字テーブルを変更します。これは標準構文テーブルも変更します。Syntax Tablesを参照してください。通常これらの関数は、標準大文字小文字テーブルを変更するために使用されます。

Function: set-case-syntax-pair uc lc case-table

この関数は、対応する文字のペア(一方は大文字、もう一方は小文字)を指定します。

Function: set-case-syntax-delims l r case-table

この関数は文字lrを、大文字小文字不変区切り(case-invariant delimiter)mpマッチングペアにします。

Function: set-case-syntax char syntax case-table

この関数はcharを、構文syntaxの、大文字小文字不変(case-invariant)とします。

Command: describe-buffer-case-table

このコマンドは、カレントバッファーの大文字小文字テーブルの内容にたいする説明を表示します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5 Lists

リスト(list)は0個以上の要素(任意のLispオブジェクト)のシーケンスを表します。リストとベクターの重要な違いは、、2つ以上のリストが、構造の一部を共有できることです。加えて、リスト全体をコピーすることなく、要素の挿入、削除ができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.1 Lists and Cons Cells

Lispでのリストは基本データ型ではありません。リストはコンスセル(cons cells)から構築されます(Cons Cell and List Typesを参照してください)。コンスセルは、順序つきペアを表現するデータオブジェクトです。つまり、コンスセルは2つのスロットをもち、それぞれのスロットはLispオブジェクトを保持(holds)、または参照(refers to)します。1つのスロットはCAR、もう1つはCDRです(これらの名前は歴史的なものです。Cons Cell and List Typesを参照してください)。CDRは“could-er(クダー)”と発音されます。

わたしたちは、コンスセルのCARスロットに現在保持されているオブジェクトが何であれ、“このコンスセルのCARは、...”のような言い方をします。これはCDRの場合も同様です。

リストとは、“互いにつながった(chained together)”一連のコンスセルであり、各セルは次のセルを参照します。リストの各要素にたいして、それぞれ1つのコンスセルがあります。慣例により、コンスセルのCARはリストの要素を保持し、CDRはリストをチェーンするのに使用されます(CARCDRの間の非対称性は完全に慣例的なものです。コンスセルのレベルでは、CARスロットとCDRスロットは同じようなプロパティーをもちます)。したがって、リスト内の各コンスセルのCDRスロットは、次のコンスセルを参照します。

これも慣例的なものですが、リスト内の最後のコンスセルのCDRnilです。わたしたちは、このようなnilで終端された構造を、真リスト(true list)と呼びます。Emacs Lispでは、シンボルnilは、シンボルであり、要素なしのリストでもあります。便宜上、シンボルnilは、そのCDR(およびCAR)にnilをもつと考えます。

したがって真リストのCDRは、常に真リストです。空でない真リストのCDRは、1番目の要素以外を含む真リストです。

リストの最後のコンスセルのCDRnil以外の何らかの値の場合、このリストのプリント表現はドットペア表記(dotted pair notation。Dotted Pair Notationを参照してください)を使用するので、わたしたちはこの構造をドットリスト(dotted list)と呼びます。他の可能性もあります。あるコンスセルのCDRが、そのリストのそれより前にある要素を指すかもしれません。わたしたちは、この構造を循環リスト(circular list)と呼びます。

ある目的にたいしては、そのリストが真リストか、循環リストなのか、ドットリストなのかが問題にならない場合もあります。そのプログラムが、リストを充分に下って最後のコンスセルのCDRを確認しようとしないなら、これは問題になりません。しかし、リストを処理するの関数のいくつかは、真リストを要求し、ドットリストの場合はエラーをシグナルします。リストの最後を探そうと試みる関数のほとんどは、循環リストを与えると無限ループに突入します。

ほとんどのコンスセルはリストの一部として使用されるので、わたしたちはコンスセルで構成される任意の構造を、リスト構造(list structure)と呼びます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.2 Predicates on Lists

以下の述語は、あるLispオブジェクトがアトムなのか、コンスセルなのか、それともリストなのか、またはオブジェクトがnilかどうかテストします(これらの述語の多くは、他の述語で定義することもできますが、多用されるので、定義する価値があるのです)。

Function: consp object

この関数は、objectがコンスセルの場合はt、それ以外はnilをreturnします。たとえnilはリストですが、コンスセルではありません。

Function: atom object

この関数は、objectがアトムの場合はt、それ以外はnilをreturnします。シンボルnilはアトムであり、リストでもあります。そのようなLispオブジェクトはnilだけです。

(atom object) ≡ (not (consp object))
Function: listp object

この関数は、objectがコンスセルかnilの場合はtをreturnします。それ以外はnilをreturnします。

(listp '(1))
     ⇒ t
(listp '())
     ⇒ t
Function: nlistp object

この関数はlistpの反対です。objectがリストでない場合はtをreturnします。それ以外はnilをreturnします。

(listp object) ≡ (not (nlistp object))
Function: null object

この関数は、objectnilの場合はt、それ以外はnilをreturnします。この関数はnotと等価ですが、明解にするために、objectをリストだと考えるときはnull、真偽値だと考えるときはnotを使用します(Constructs for Combining Conditionsnotを参照してください)。

(null '(1))
     ⇒ nil
(null '())
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.3 Accessing Elements of Lists

Function: car cons-cell

この関数は、コンスセルcons-cellの1番目のスロットにより参照される値をreturnします。他の言い方をすると、この関数はcons-cellCARをreturnします。

特別なケースとして、cons-cellnilの場合、この関数はnilをreturnします。したがって、リストはすべて引数として有効です。引数がコンスセルでもnilでもない場合、エラーがシグナルされます。

(car '(a b c))
     ⇒ a
(car '())
     ⇒ nil
Function: cdr cons-cell

この関数は、コンスセルcons-cellの2番目のスロットにより参照される値をreturnします。他の言い方をすると、この関数はcons-cellCDRをreturnします。

特別なケースとして、cons-cellnilの場合、この関数はnilをreturnします。したがって、リストはすべて引数として有効です。引数がコンスセルでもnilでもない場合、エラーがシグナルされます。

(cdr '(a b c))
     ⇒ (b c)
(cdr '())
     ⇒ nil
Function: car-safe object

この関数により、他のデータ型によるエラーを起こさずに、コンスセルのCARを取得できます。この関数は、objectがコンスセルの場合はobjectCAR、それ以外はnilをreturnします。この関数は、objectがリスとでないときはエラーをシグナルするcarとは対象的です。

(car-safe object)
≡
(let ((x object))
  (if (consp x)
      (car x)
    nil))
Function: cdr-safe object

この関数により、他のデータ型によるエラーを起こさずに、コンスセルのCDRを取得できます。この関数は、objectがコンスセルの場合はobjectCDR、それ以外はnilをreturnします。この関数は、objectがリスとでないときはエラーをシグナルするcdrとは対象的です。

(cdr-safe object)
≡
(let ((x object))
  (if (consp x)
      (cdr x)
    nil))
Macro: pop listname

このマクロはリストのCARを調べて、それをリストから取り去るのを1度に行なう便利な方法を提供します。この関数はlistnameに格納されたリストにたいして処理を行ないます。この関数はリストから1番目の要素を削除して、CDRlistnameに保存し、その後で削除した要素をreturnします。

1番単純なケースは、リストに名前をつけるためのクォートされていないシンボルの場合です。この場合、このマクロは(prog1 (car listname) (setq listname (cdr listname)))と等価です。

x
     ⇒ (a b c)
(pop x)
     ⇒ a
x
     ⇒ (b c)

より一般的なのは、listnameが汎変数(generalized variable)の場合です。この場合、このマクロはsetfを使用してlistnameに保存します。Generalized Variablesを参照してください。

リストに要素を追加するpushマクロについては、Modifying List Variablesを参照してください。

Function: nth n list

この関数は、listn番目の要素をreturnします。要素は0から数えられるので、listCARは要素0になります。listの長さがn以下の場合、値はnilです。

(nth 2 '(1 2 3 4))
     ⇒ 3
(nth 10 '(1 2 3 4))
     ⇒ nil

(nth n x) ≡ (car (nthcdr n x))

関数eltは似ていますが、これは任意の種類のシーケンスに適用されます。歴史的な理由により、この関数は逆の順序で引数を受け取ります。Sequencesを参照してください。

Function: nthcdr n list

この関数は、listn番目のCDRをreturnします。他の言い方をすると、この関数はlistの最初のn個のリンクをスキップしてから、それ以降をreturnします。

nが0の場合、nthcdrlist全体をreturnします。listの長さがn以下の場合、nthcdrnilをreturnします。

(nthcdr 1 '(1 2 3 4))
     ⇒ (2 3 4)
(nthcdr 10 '(1 2 3 4))
     ⇒ nil
(nthcdr 0 '(1 2 3 4))
     ⇒ (1 2 3 4)
Function: last list &optional n

この関数は、listの最後のリンクをreturnします。このリンクのcarは、このリストの最後の要素です。listがnullの場合、nilがreturnされます。nが非nilの場合、n番目から最後までのリンクがreturnされます。nlistの長さより大きい場合は、list全体がreturnされます。

Function: safe-length list

この関数は、エラーや無限ループの危険なしで、listの長さをreturnします。この関数は一般的に、リスト内のコンスセルの個数をreturnします。しかし循環リストでは、単に上限値が値となるため、非常に大きくなる場合があります。

listnilでもコンスセルでもない場合、safe-lengthは0をreturnします。

循環リストを考慮しなくてもよい場合に、リストの長さを計算するもっとも一般的な方法は、lengthを使うことです。Sequencesを参照してください。

Function: caar cons-cell

これは、(car (car cons-cell))と同じです。

Function: cadr cons-cell

これは、(car (cdr cons-cell))または(nth 1 cons-cell)と同じです。

Function: cdar cons-cell

これは、(cdr (car cons-cell))と同じです。

Function: cddr cons-cell

これは、(cdr (cdr cons-cell))または(nthcdr 2 cons-cell)と同じです。

Function: butlast x &optional n

この関数は、リストxから、最後の要素、または最後のn個の要素を削除してreturnします。nが0より大きい場合、この関数はリストのコピーを作成するので、元のリストに影響はありません。一般的に、(append (butlast x n) (last x n))は、xと等しいリストをreturnします。

Function: nbutlast x &optional n

この関数は、リストのコピーを作成するのではなく、cdrを適切な要素に変更することにより破壊的に機能するバージョンのbutlastです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.4 Building Cons Cells and Lists

リストはLispの核にあるので、リストを構築する多くの関数があります。consはリストを構築する基本的な関数です。しかしEmacsのソースコードでは、consよりlistのほうが多く使用されているのは興味深いことです。

Function: cons object1 object2

この関数は、新しいリスト構造を構築するための、もっとも基本的な関数です。この関数は、object1CARobject2CDRとする、新しいコンスセルを作成して、それから新しいコンスセルをreturnします。引数object1object2は、任意のLispオブジェクトを指定できますが、ほとんどの場合、object2はリストです。

(cons 1 '(2))
     ⇒ (1 2)
(cons 1 '())
     ⇒ (1)
(cons 1 2)
     ⇒ (1 . 2)

リストの先頭に1つの要素を追加するために、consがよく使用されます。これは、リストに要素をコンスすると言います。2たとえば:

(setq list (cons newelt list))

この例で使用されているlistという名前の変数と、以下で説明するlistという名前の関数は、競合しないことに注意してください。任意のシンボルは、両方の役割を果たすことができます。

Function: list &rest objects

この関数は、objectsを要素とするリストを作成します。結果となるリストは、常にnil終端されます。objectsを指定しない場合、空リストがreturnされます。

(list 1 2 3 4 5)
     ⇒ (1 2 3 4 5)
(list 1 2 '(3 4 5) 'foo)
     ⇒ (1 2 (3 4 5) foo)
(list)
     ⇒ nil
Function: make-list length object

この関数は、各要素がobjectの、length個の要素からなるリストを作成します。make-listmake-string(Creating Stringsを参照してください)を比較してみてください。

(make-list 3 'pigs)
     ⇒ (pigs pigs pigs)
(make-list 0 'pigs)
     ⇒ nil
(setq l (make-list 3 '(a b)))
     ⇒ ((a b) (a b) (a b))
(eq (car l) (cadr l))
     ⇒ t
Function: append &rest sequences

この関数は、sequencesのすべての要素を服務リストをreturnします。sequencesには、リスト、ベクター、ブールベクター、文字列も指定できますが、通常は最後にリストを指定するべきです。最後の引数を除くすべての引数はコピーされるので、変更される引数はありません(コピーを行なわずにリストを結合する方法については、Functions that Rearrange Listsnconcを参照してください)。

より一般的には、appendにたいする最後の引数は、任意のLispオブジェクトかもしれません。最後の引数は、コピーまたは変換されません。最後の引数は、新しいリストの最後のコンスセルのCDRになります。最後の引数もリストならば、このリストの要素は、実質的には結果リストの要素になります。最後の要素がリストでない場合、最後のCDRが(真リストで要求される)nilではないので、結果はドットリストになります。

以下はappendを使用した例です:

(setq trees '(pine oak))
     ⇒ (pine oak)
(setq more-trees (append '(maple birch) trees))
     ⇒ (maple birch pine oak)
trees
     ⇒ (pine oak)
more-trees
     ⇒ (maple birch pine oak)
(eq trees (cdr (cdr more-trees)))
     ⇒ t

appendがどのように機能するか、ボックスダイアグラムで見ることができます。変数treesはリスト(pine oak)にセットされ、それから変数more-treesにリスト(maple birch pine oak)がセットされます。しかし変数treesは継続して元のリストを参照します:

more-trees                trees
|                           |
|     --- ---      --- ---   -> --- ---      --- ---
 --> |   |   |--> |   |   |--> |   |   |--> |   |   |--> nil
      --- ---      --- ---      --- ---      --- ---
       |            |            |            |
       |            |            |            |
        --> maple    -->birch     --> pine     --> oak

空のシーケンスは、appendによりreturnされる値に寄与しません。この結果、最後の引数にnilを指定すると、それより前の引数のコピーを強制することになります。

trees
     ⇒ (pine oak)
(setq wood (append trees nil))
     ⇒ (pine oak)
wood
     ⇒ (pine oak)
(eq wood trees)
     ⇒ nil

これは関数copy-sequenceが導入される以前は、リストをコピーする通常の方法でした。Sequences, Arrays, and Vectorsを参照してください。

以下は、appendの引数としてベクターと文字列を使用する例です:

(append [a b] "cd" nil)
     ⇒ (a b 99 100)

apply (Calling Functionsを参照してください)の助けを借りることにより、リストのリストの中の、すべてのリストをappendできます。

(apply 'append '((a b c) nil (x y z) nil))
     ⇒ (a b c x y z)

sequencesが与えられない場合、nilがreturnされます:

(append)
     ⇒ nil

以下は、最後の引数がリストでない場合の例です:

(append '(x y) 'z)
     ⇒ (x y . z)
(append '(x y) [z])
     ⇒ (x y . [z])

2番目の例は、最後の引数はシーケンスですがリスとではない場合で、このシーケンスの要素は、結果リストの要素にはなりません。かわりに、最後の引数がリストでないときと同様、シーケンスが最後のCDRになります。

Function: reverse list

この関数は、要素はlistの要素ですが、順序が逆の新しいリストを作成します。元の引数listは、変更されません

(setq x '(1 2 3 4))
     ⇒ (1 2 3 4)
(reverse x)
     ⇒ (4 3 2 1)
x
     ⇒ (1 2 3 4)
Function: copy-tree tree &optional vecp

この関数はツリーtreeのコピーをreturnします。treeがコンスセルの場合、同じCARCDRをもつ新しいコンスセルを作成してから、同じ方法によりCARCDRを再帰的にコピーします。

通常、treeがコンスセル以外の場合、copy-treeは単にtreeをreturnします。しかし、vecpが非nilの場合、この関数はベクターでもコピーします(そしてベクターの要素を再帰的に処理します)。

Function: number-sequence from &optional to separation

これは、fromからseparationづつインクリメントして、toの直前で終わる、数字のリストをreturnします。separationには正または負の数を指定でき、デフォルトは1です。tonil、または数的にfromと等しい場合、値は1要素のリスト(from)になります。separationが正でtofromより小さい場合、またはseparationが負でtofromより大きい場合、これらの引数は空のシーケンスを指示することになるので、値はnilになります。

separationが0で、tonilでもなく、数的にfromとも等しくない場合、これらの引数は無限シーケンスを指示することになるので、エラーがシグナルされます。

引数はすべて数字です。浮動少数の計算は正確ではないので、浮動少数の引数には用心する必要があります。たとえばマシンに依存して、(number-sequence 0.4 0.8 0.2)が3要素のリストをreturnするのに、(number-sequence 0.4 0.6 0.2)が1要素のリスト(0.4)をreturnすることがよく起こります。リストのn番目の要素は、厳密に(+ from (* n separation))という式により計算されます。したがって、リストに確実にtoが含まれるようにするには、この式に適切な型のtoを渡すことができます。別の方法として、toを少しだけ大きな値(separationが負の場合は、少しだけ小さな値)に置き換えることもできます。

いくつか例を示します:

(number-sequence 4 9)
     ⇒ (4 5 6 7 8 9)
(number-sequence 9 4 -1)
     ⇒ (9 8 7 6 5 4)
(number-sequence 9 4 -2)
     ⇒ (9 7 5)
(number-sequence 8)
     ⇒ (8)
(number-sequence 8 5)
     ⇒ nil
(number-sequence 5 8 -1)
     ⇒ nil
(number-sequence 1.5 6 2)
     ⇒ (1.5 3.5 5.5)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.5 Modifying List Variables

これらの関数、および1つのマクロは、変数に格納されたリストを変更する便利な方法を提供します。

Macro: push element listname

このマクロは、CARelementで、CDRlistnameで指定されたリストであるような新しいリストを作成して、そのリストをlistnameに保存します。単純なのは、listnameはリストに名前をつけるクォートされていないシンボルのときで、この場合マクロは(setq listname (cons element listname))と等価です。

(setq l '(a b))
     ⇒ (a b)
(push 'c l)
     ⇒ (c a b)
l
     ⇒ (c a b)

より一般的なのは、listnameが汎変数の場合です。この場合、このマクロは(setf listname (cons element listname))と等価です。Generalized Variablesを参照してください。

リストから1番目の要素を取り出すpopマクロについては、Accessing Elements of Listsを参照してください。

以下の2つの関数は、変数の値であるリストを変更します。

Function: add-to-list symbol element &optional append compare-fn

この関数は、elementsymbolの値のメンバーでない場合は、symbolelementをコンスすることにより、変数symbolをセットします。この関数は、リストが更新されているかに関わらず、結果のリストをreturnしますsymbolの値は、呼び出し前にすでにリストであることが望ましいです。elementがリストの既存メンバーか比較するために、add-to-listcompare-fnを使用します。compare-fnnilの場合は、equalを使用します。

elementが追加される場合は通常、symbolの前に追加されますが、オプションの引数appendが非nilの場合は、最後に追加されます。

引数symbolは、暗黙にクォートされません。setqとは異なり、add-to-listsetのような通常の関数です。クォートしたい場合は自分で引数をクォートします。

以下はadd-to-listを使用する方法をシナリオで示します:

(setq foo '(a b))
     ⇒ (a b)

(add-to-list 'foo 'c)     ;; cを追加。
     ⇒ (c a b)

(add-to-list 'foo 'b)     ;; 効果なし。
     ⇒ (c a b)

foo                       ;; fooが変更された。
     ⇒ (c a b)

以下は(add-to-list 'var value)と等価な式です:

(or (member value var)
    (setq var (cons value var)))
Function: add-to-ordered-list symbol element &optional order

この関数は、古い値(リストでなければなりません)のorderで指定された位置に、elementを挿入することにより、変数symbolをセットします。elementがすでにこのリストのメンバーである場合、リスト内の要素の位置はorderにしたがって調整されます。メンバーかどうかは、eqを使用してテストされます。この関数は、更新されているかどうかに関わらず、結果のリストをreturnします。

orderは通常、数字(正数か浮動小数)で、リストの要素は、その数字の昇順で並べられます。

orderを省略またはnilにすることもできます。これにより、リストにelementがすでに存在する場合、elementの数字順序は変更されません。それ以外では、elementは数字順序をもちません。リストの数字順序をもたない要素は、リストの最後に配され、特別な順序はつきません。

orderに他の値を指定した場合、elementがすでに数字順序をもつときは数字順序が削除されます。それ以外は、nilと同じです。

引数symbolは、暗黙にクォートされません。add-to-ordered-listは、setqなどとは異なり、setのような通常の関数です。必要な場合は引数を自分でクォートしてください。

順序の情報は、symbollist-orderプロパティーのハッシュテーブルに保存されます。

以下にadd-to-ordered-listを使用する方法をシナリオで示します:

(setq foo '())
     ⇒ nil

(add-to-ordered-list 'foo 'a 1)     ;; aを追加。
     ⇒ (a)

(add-to-ordered-list 'foo 'c 3)     ;; cを追加。
     ⇒ (a c)

(add-to-ordered-list 'foo 'b 2)     ;; bを追加。
     ⇒ (a b c)

(add-to-ordered-list 'foo 'b 4)     ;; bを移動。
     ⇒ (a c b)

(add-to-ordered-list 'foo 'd)       ;; dを後に追加。
     ⇒ (a c b d)

(add-to-ordered-list 'foo 'e)       ;; eを追加。
     ⇒ (a c b e d)

foo                       ;; fooが変更された。
     ⇒ (a c b e d)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6 Modifying Existing List Structure

基本関数setcarおよびsetcdrにより、コンスセルのCARおよびCDRの内容を変更できます。わたしたちは、これらが既存のリスト構造を変更することから、これらを“破壊的”処理と呼びます。

Common Lispに関する注意: Common Lispはリスト構造の変更にrplacaおよびrplacdを使用します。これらはsetcarsetcdrと同じ方法でリスト構造を変更しますが、setcarsetcdrは新しいCARまたはCDRをreturnするのにたいし、Common Lispの関数はコンスセルをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6.1 Altering List Elements with setcar

コンスセルのCARの変更は、setcarにより行なわれます。リストにたいして使用された場合、setcarはリストの1つの要素を、他の要素に置き換えます。

Function: setcar cons object

この関数は、以前のCARを置き換えて、consの新しいCARobjectを格納します。他の言い方をすると、この関数はconsCARスロットを、objectを参照するように変更します。この関数は値objectをreturnします。たとえば:

(setq x '(1 2))
     ⇒ (1 2)
(setcar x 4)
     ⇒ 4
x
     ⇒ (4 2)

コンスセルが、複数のリストが共有された構造の一部の場合、コンスに新しいCARを格納することにより、これら共有されたリストの各1つの要素を変更します。以下は例です:

;; 部分的に共有された2つのリストを作成。
(setq x1 '(a b c))
     ⇒ (a b c)
(setq x2 (cons 'z (cdr x1)))
     ⇒ (z b c)
;; 共有されたリンクのCARを置き換え。
(setcar (cdr x1) 'foo)
     ⇒ foo
x1                           ; 両方のリストが変更された。
     ⇒ (a foo c)
x2
     ⇒ (z foo c)
;; 共有されていないリンクのCARを置き換え。
(setcar x1 'baz)
     ⇒ baz
x1                           ; 1つのリストだけが変更された。
     ⇒ (baz foo c)
x2
     ⇒ (z foo c)

なぜbを置き換えると両方が変更されるのかを説明するために、変数x1x2の2つのリストによる共有構造を視覚化してみましょう:

        --- ---        --- ---      --- ---
x1---> |   |   |----> |   |   |--> |   |   |--> nil
        --- ---        --- ---      --- ---
         |        -->   |            |
         |       |      |            |
          --> a  |       --> b        --> c
                 |
       --- ---   |
x2--> |   |   |--
       --- ---
        |
        |
         --> z

同じ関係を別のボックス図で示すと、以下のようになります:

x1:
 --------------       --------------       --------------
| car   | cdr  |     | car   | cdr  |     | car   | cdr  |
|   a   |   o------->|   b   |   o------->|   c   |  nil |
|       |      |  -->|       |      |     |       |      |
 --------------  |    --------------       --------------
                 |
x2:              |
 --------------  |
| car   | cdr  | |
|   z   |   o----
|       |      |
 --------------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6.2 Altering the CDR of a List

CDRを変更するもっとも低レベルの基本関数は、setcdrです:

Function: setcdr cons object

この関数は前のCDRを置き換えて、consの新しいCDRobjectを格納します。他の言い方をすると、この関数はconsCDRを、objectを参照するように変更します。この関数は値objectをreturnします。

以下はリストのCDRを、他のリストに置き換える例です。1番目の要素以外のすべての要素は、別のシーケンスまたは要素のために取り除かれます。1番目の要素はリストのCARなので変更されず、CDRを通じて到達することもできないからです。

(setq x '(1 2 3))
     ⇒ (1 2 3)
(setcdr x '(4))
     ⇒ (4)
x
     ⇒ (1 4)

リスト内のコンスセルのCDRを変更することにより、リストの途中から要素を削除できます。たとえば以下では、1番目のコンスセルのCDRを変更することにより、2番目の要素bを、リスト(a b c)から削除します。

(setq x1 '(a b c))
     ⇒ (a b c)
(setcdr x1 (cdr (cdr x1)))
     ⇒ (c)
x1
     ⇒ (a c)

以下に結果をボックス表記で示します:

                   --------------------
                  |                    |
 --------------   |   --------------   |    --------------
| car   | cdr  |  |  | car   | cdr  |   -->| car   | cdr  |
|   a   |   o-----   |   b   |   o-------->|   c   |  nil |
|       |      |     |       |      |      |       |      |
 --------------       --------------        --------------

以前は要素bを保持していた2番目のコンスセルは、依然として存在して、そのCARbのままですが、すでにこのリストの一部を形成していません。

CDRを変更して、新しい要素を挿入するのも、同じくらい簡単です:

(setq x1 '(a b c))
     ⇒ (a b c)
(setcdr x1 (cons 'd (cdr x1)))
     ⇒ (d b c)
x1
     ⇒ (a d b c)

以下に結果をボックス表記で示します:

 --------------        -------------       -------------
| car  | cdr   |      | car  | cdr  |     | car  | cdr  |
|   a  |   o   |   -->|   b  |   o------->|   c  |  nil |
|      |   |   |  |   |      |      |     |      |      |
 --------- | --   |    -------------       -------------
           |      |
     -----         --------
    |                      |
    |    ---------------   |
    |   | car   | cdr   |  |
     -->|   d   |   o------
        |       |       |
         ---------------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6.3 Functions that Rearrange Lists

以下では、リストの構成要素であるコンスセルのCDRを変更することにより、リストを“破壊的”に再配置する関数をいくつか示します。これらの関数が“破壊的”だという理由は、これらの関数が引数として渡された元のリストを処理して、return値となる新しいリストを形成するために、リストのコンスセルを再リンクするからです。

コンスセルを変更する他の関数については、Using Lists as Setsdelqを参照してください。

Function: nconc &rest lists

この関数は、listsの要素すべてを含むリストをreturnします。append (Building Cons Cells and Listsを参照してください)とは異なり、listsはコピーされません。かわりにlistsの各リストの最後のCDRが、次のリストを参照するように変更されます。listsの最後のリストは、変更されません。たとえば:

(setq x '(1 2 3))
     ⇒ (1 2 3)
(nconc x '(4 5))
     ⇒ (1 2 3 4 5)
x
     ⇒ (1 2 3 4 5)

nconcの最後の引数は変更されないので、上記の例のように、'(4 5)のような定数リストを使用するのが理に適っています。また、同じ理由により、最後の引数がリスとである必要はありません。

(setq x '(1 2 3))
     ⇒ (1 2 3)
(nconc x 'z)
     ⇒ (1 2 3 . z)
x
     ⇒ (1 2 3 . z)

しかし、(最後を除くすべての)他の引数はリストでなければなりません。

一般的な落とし穴としては、nconcにたいしてクォートされたリスト定数を、最後以外の引数として使用したときです。これを行なう場合、実行するごとにプログラムはリスト定数を変更するでしょう! 何が起こるのかを以下に示します:

(defun add-foo (x)            ; この関数ではfoo
  (nconc '(foo) x))           ;   を引数の前に追加させたい。
(symbol-function 'add-foo)
     ⇒ (lambda (x) (nconc (quote (foo)) x))
(setq xx (add-foo '(1 2)))    ; 動いているように見える。
     ⇒ (foo 1 2)
(setq xy (add-foo '(3 4)))    ; 何が起きているのか?
     ⇒ (foo 1 2 3 4)
(eq xx xy)
     ⇒ t
(symbol-function 'add-foo)
     ⇒ (lambda (x) (nconc (quote (foo 1 2 3 4) x)))
Function: nreverse list

この関数は、listの要素の順番を逆転します。reverseとは異なり、nreverseはリストを形成するCDR内のコンスセルを逆転することにより、引数を変更します。listの最後に使用されているコンスセルは、最初のコンスセルになります。

たとえば:

(setq x '(a b c))
     ⇒ (a b c)
x
     ⇒ (a b c)
(nreverse x)
     ⇒ (c b a)
;; 最初のコンスセルが最後になった。
x
     ⇒ (a)

わたしたちは通常、混乱を避けるために、nreverseの結果を、元のリストを保持していたのと同じ変数に格納します:

(setq x (nreverse x))

以下は、(a b c)を視覚的に表した、nreverseの例です:

元のリストの先頭:                         逆転されたリスト:
 -------------        -------------        ------------
| car  | cdr  |      | car  | cdr  |      | car | cdr  |
|   a  |  nil |<--   |   b  |   o  |<--   |   c |   o  |
|      |      |   |  |      |   |  |   |  |     |   |  |
 -------------    |   --------- | -    |   -------- | -
                  |             |      |            |
                   -------------        ------------
Function: sort list predicate

この関数は、listを安定的(しかし破壊的)にソートして、ソートされたリストをreturnします。この関数はpredicateを使用して要素を比較します。安定ソート(stable sort)では、同じソートキーをもつ要素が、ソートの前後で相対的に同じ順序が維持されます。安定性は、異なる条件によりソートするために要素を並び替えるために、連続したソートが使用されるときに重要です。

引数predicateは、2つの引数をとる関数でなければなりません。この関数はlistの2つの要素を引数として呼び出されます。昇順のソートを得るためのpredicateは、1番目の引数が、2番目の引数より“小さい”ときは非nil、それ以外はnilをreturnするようにします。

比較関数predicateは、少なくとも単独のsort呼び出しにおいて、任意の与えられた引数にたいして信頼できる結果を与えなければありません。比較関数は非対称的(antisymmetric) — つまりabより小さいとき、baより小さくない — でなければなりません。比較関数は推移的(transitive) — つまりabより小さく、bcより小さい場合、caより小さい — でなければなりません。これらの要求を満たさない比較関数を使用した場合、sortの結果は予測できません。

sortの破壊的な側面は、CDRを変更することにより、listを形成するコンスセルを再配置することです。非破壊的なソート関数の場合は、ソートされた要素を格納するために、あたらしいコンスセルを作成します。元のリストを破壊せずにソートされたコピーを作成したい場合は、copy-sequenceで最初にコピーしてから、それをソートします。

ソートはlist内のコンスセルのCARは変更しません。list内でCARに要素aを保持していたコンスセル、ソート後にもaを保持しますが、CDRは変更されるので、ソート後の位置は異なります。たとえば:

(setq nums '(1 3 2 6 5 4 0))
     ⇒ (1 3 2 6 5 4 0)
(sort nums '<)
     ⇒ (0 1 2 3 4 5 6)
nums
     ⇒ (1 2 3 4 5 6)

警告: numsのリストには0が含まれていないことに注意してください。これは前と同じコンスセルですが、リストの1番目ではなくなります。引数を保持するように形成された変数が、ソートされたリストでも保持されると仮定しないでください! かわりにsortの結果を保存して、それを使用してください。元のリストを保持していた変数に、結果を書き戻すことはよく行なわれます。

(setq nums (sort nums '<))

ソート処理を行なう他の関数については、Sorting Textを参照してください。sortの有用な例は、Access to Documentation Stringsdocumentationを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.7 Using Lists as Sets

リストは順序なしの数学的集合 — リスト内に要素があれば集合の要素の値とされ、リスト内の順序は無視される — を表すことができます。2つの集合を結合(union)するには、(重複する要素を気にしない場合は)appendを使用します。equalである重複を取り除くには、delete-dupsを使用します。集合にたいする他の有用な関数には、memqdelq、およびこれらのequalバージョンであるmemberdeleteが含まれます。

Common Lispに関する注意: 集合を処理するために、Common Lispには(要素の重複がない)関数unionがあります。これらの関数は標準のGNU Emacs Lispにはありませんが、cl-libはこれらを提供します。Lists as Sets in Common Lisp Extensionsを参照してください。

Function: memq object list

この関数は、objectlistのメンバーかどうかをテストします。メンバーの場合、memqobjectで最初に見つかった要素から開始されるリストをreturnします。メンバーでない場合は、nilをreturnします。memqの文字‘q’は、この関数がobjectとリスト内の要素の比較に、eqを使用することを示します。たとえば:

(memq 'b '(a b c b a))
     ⇒ (b c b a)
(memq '(2) '((1) (2)))    ; (2)(2)eqではない。
     ⇒ nil
Function: delq object list

この関数listからはobjecteqなすべての要素を破壊的に取り除いて、結果のリストをreturnします。delqの文字‘q’は、この関数がobjectとリスト内の要素の比較に、eqを使用することを示します(memqremqと同様)。

delqを呼び出すときは通常、元のリストを保持していた変数にreturn値を割り当てて使用する必要があります(理由は以下参照)。

delq関数がリストの銭湯にある要素を削除する場合は、単にリストを読み進めて、この要素の後から開始される部分リストをreturnします。つまり:

(delq 'a '(a b c)) ≡ (cdr '(a b c))

リストの途中にある要素を削除するときは、必要なCDR(Altering the CDR of a Listを参照してください)を変更することにより削除します。

(setq sample-list '(a b c (4)))
     ⇒ (a b c (4))
(delq 'a sample-list)
     ⇒ (b c (4))
sample-list
     ⇒ (a b c (4))
(delq 'c sample-list)
     ⇒ (a b (4))
sample-list
     ⇒ (a b (4))

(delq 'a sample-list)は何も取り除きませんが(これは単に短いリストをreturnします)、(delq 'c sample-list)は3番目の要素を取り除いて、sample-listを変更することに注意してください。引数listを保持するように形成された変数が、実行後にもっと少ない要素になる、または元のリストを保持すると仮定しないでください! かわりにdelqの結果を保存して、それを使用してください。元のリストを保持していた変数に、結果を書き戻すことはよく行なわれます。

(setq flowers (delq 'rose flowers))

以下の例では、delqが比較しようとしている(4)と、sample-list内の(4)は、eqではありません:

(delq '(4) sample-list)
     ⇒ (a c (4))

与えられた値とequalな要素を削除したい場合は、delete(以下参照)を使用してください。

Function: remq object list

この関数は、objecteqなすべての要素が除かれた、listのコピーをreturnします。remqの文字‘q’は、この関数がobjectとリスト内の要素の比較に、eqを使用することを示します。

(setq sample-list '(a b c a b c))
     ⇒ (a b c a b c)
(remq 'a sample-list)
     ⇒ (b c b c)
sample-list
     ⇒ (a b c a b c)
Function: memql object list

関数memqlは、eql(浮動少数の要素は値で比較される)を使用してメンバーとeqlを比較することにより、objectlistのメンバーかどうかをテストします。objectがメンバーの場合、memqllist内で最初に見つかった要素から開始されるリストをreturnします。それ以外はnilをreturnします。

これをmemqと比較してみましょう:

(memql 1.2 '(1.1 1.2 1.3))  ; 1.21.2eql
     ⇒ (1.2 1.3)
(memq 1.2 '(1.1 1.2 1.3))  ; 1.21.2eqではない。
     ⇒ nil

以下の3つの関数はmemqdelqremqと似ていますが、要素の比較にeqではなく、equalを使用します。Equality Predicatesを参照してください。

Function: member object list

関数memberは、メンバーとobjectequalを使用して比較して、objectlistのメンバーかどうかをテストします。objectがメンバーの場合、memberlistで最初に見つかったところから開始されるリストをreturnします。それ以外はnilを参照してください。

これをmemqと比較してみましょう:

(member '(2) '((1) (2)))  ; (2) and (2) are equal.
     ⇒ ((2))
(memq '(2) '((1) (2)))    ; (2)(2)eqではない。
     ⇒ nil
;; 同じ内容の2つの文字列はequal
(member "foo" '("foo" "bar"))
     ⇒ ("foo" "bar")
Function: delete object sequence

この関数は、sequenceからobjectequalな要素を取り除いて、結果のシーケンスをreturnします。

sequenceがリストの場合、deletedelqに対応するように、membermemqに対応します。つまり、この関数はmemberと同様、要素とobjectの比較にequalを使用します。マッチする要素が見つかったら、delqが行なうように、その要素を取り除きます。delqと同様、通常は元のリストを保持していた変数にreturn値を割り当てて使用します。

sequenceがベクターまたは文字列の場合、deleteobjectequalなすべての要素を取り除いた、sequenceのコピーをreturnします。

たとえば:

(setq l '((2) (1) (2)))
(delete '(2) l)
     ⇒ ((1))
l
     ⇒ ((2) (1))
;; lの変更に信頼性を要するときは
;; (setq l (delete '(2) l))と記述する。
(setq l '((2) (1) (2)))
(delete '(1) l)
     ⇒ ((2) (2))
l
     ⇒ ((2) (2))
;; このケースではlのセットの有無に違いはない
;; しかし他のケースに倣ってセットするべき。
(delete '(2) [(2) (1) (2)])
     ⇒ [(1)]
Function: remove object sequence

この関数は、deleteに対応する非破壊的な関数です。この関数は、objectequalな要素を取り除いた、sequence(リスト、ベクター、文字列)のコピーをreturnします。たとえば:

(remove '(2) '((2) (1) (2)))
     ⇒ ((1))
(remove '(2) [(2) (1) (2)])
     ⇒ [(1)]

Common Lispに関する注意: GNU Emacs Lispの関数memberdeleteremoveは、Common Lispではなく、Maclispを継承しています。Common Lispでは、比較にequalを使用しません。

Function: member-ignore-case object list

この関数は、memberと同様ですが、objectが文字列で、大文字小文字とテキスト表現の違いを無視します。文字の大文字と小文字は等しいものとして扱われ、比較に先立ちユニバイト文字列はマルチバイト文字列に変換されます。

Function: delete-dups list

この関数は、listからすべてのequalな重複を、破壊的に取り除いて。、結果をlistに保管して、それをreturnします。list内の要素にequalな要素がいくつかある場合、delete-dupsは最初の要素を残します。

変数に格納されたリストに要素を追加したり、それを集合として使用する方法については、Modifying List Variablesの関数add-to-listも参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.8 Association Lists

連想配列(association list。短くはalist)は、キーと値のマッピングを記録します。これは連想(associations)と呼ばれるコンスセルのリストです。各コンスセルにおいて、CARキー(key)で、CDR連想値(associated value)になります。3

以下はalistの例です。キーpineは、値conesに関連付けられます。キーoakは、acornsに関連付けられます。キーmapleは、seedsに関連付けられます。

((pine . cones)
 (oak . acorns)
 (maple . seeds))

alist内の値とキーには、任意のLispオブジェクトを指定できます。たとえば以下のalist0では、シンボルaは数字1に、文字列"b"リスト(2 3)(alist要素のCDR)に関連付けられます。

((a . 1) ("b" 2 3))

要素のCDRCARに連想値を格納するようにalistデザインするほうがよい場合があります。以下は、そのようなalistです。

((rose red) (lily white) (buttercup yellow))

この例では、redroseに関連付けられる値だと考えます。この種のalistの利点は、CDRCDRの中に、他の関連する情報 — 他のアイテムのリストでさえ — を格納することができることです。不利な点は、与えられた値を含む要素を見つけるためにrassq(以下参照)を使用できないことです。これらを検討することが重要でない場合には、任意の与えられたalistにたいして一貫している限り、選択は好みの問題といえます。

上記で示したのと同じalistは、要素のCDRに連想値をもつと考えることができます。この場合、roseに関連付けられる値は、リスト(red)になるでしょう。

連想リストは、新しい連想を簡単にリストの先頭に追加できるので、スタックに保持したいような情報を記録するのによく使用されます。連想リストから与えられたキーにたいする連想を検索する場合、それが複数ある場合は、最初に見つかったものがreturnされます。

Emacs Lispでは、連想リストがコンスセルではない場合、それはエラーではありません。alist検索関数は、単にそのような要素を無視します。多くの他のバージョンのLいspでは、このような場合はエラーをシグナルします。

いくつかの観点において、プロパティーリストは連想リストと似ていることに注意してください。それぞれのキーが1度だけ出現するような場合、プロパティーリストは連想リストと同様に振る舞います。プロパティーリストと連想リストの比較については、Property Listsを参照してください。

Function: assoc key alist

この関数は、alist要素にたいしてkeyを比較するのにequalを使用して、alist内からkeyをもつ最初の連想をreturnします。CARkeyequalの連想がalistにない場合、この関数はnilをreturnします。たとえば:

(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
     ⇒ ((pine . cones) (oak . acorns) (maple . seeds))
(assoc 'oak trees)
     ⇒ (oak . acorns)
(cdr (assoc 'oak trees))
     ⇒ acorns
(assoc 'birch trees)
     ⇒ nil

以下はキーと値がシンボルでない場合の例です:

(setq needles-per-cluster
      '((2 "Austrian Pine" "Red Pine")
        (3 "Pitch Pine")
        (5 "White Pine")))

(cdr (assoc 3 needles-per-cluster))
     ⇒ ("Pitch Pine")
(cdr (assoc 2 needles-per-cluster))
     ⇒ ("Austrian Pine" "Red Pine")

関数assoc-stringassocと似ていますが、文字列間の特定の違いを無視する点が異なります。Comparison of Characters and Stringsを参照してください。

Function: rassoc value alist

この関数は、alistの中から、値valueをもつ最初の連想をreturnします。CDRvalueequalの連想がalistにない場合、この関数はnilをreturnします。

rassocassocと似ていますが、CARではなく、alistの連想のCDRを比較します。この関数を、与えられた値に対応するキーを探す、“reverse assoc”と考えることができます。

Function: assq key alist

この関数は、alistからkeyをもつ最初の連想をreturnする点はassocと同様ですが、比較にequalではなくeqを使用します。CARkeyeqな連想がalist内に存在しない場合、assqnilをreturnします。eqequalより早く、ほとんどのalistはキーにシンボルを使用するので、この関数はassocより多用されます。Equality Predicatesを参照してください。

(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
     ⇒ ((pine . cones) (oak . acorns) (maple . seeds))
(assq 'pine trees)
     ⇒ (pine . cones)

反対に、キーがシンボルではないalistでは通常、assqは有用ではありません:

(setq leaves
      '(("simple leaves" . oak)
        ("compound leaves" . horsechestnut)))

(assq "simple leaves" leaves)
     ⇒ nil
(assoc "simple leaves" leaves)
     ⇒ ("simple leaves" . oak)
Function: rassq value alist

この関数は、alist内から値valueをもつ最初の連想をreturnします。alist内にCDRvalueeqな連想が存在しない場合は、nilをreturnします。

rassqassqと似ていますが、CARではなく、alistの各連想のCDRを比較します。この関数を、与えられた値に対応するキーを探す、“reverse assq”と考えることができます。

たとえば:

(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))

(rassq 'acorns trees)
     ⇒ (oak . acorns)
(rassq 'spores trees)
     ⇒ nil

rassqは、要素のCDRCARに保管された値の検索はできません:

(setq colors '((rose red) (lily white) (buttercup yellow)))

(rassq 'white colors)
     ⇒ nil

この場合、連想(lily white)CDRwhiteではなく、リスト(white)です。これは連想をドットペア表記で記述すると明確になります:

(lily white) ≡ (lily . (white))
Function: assoc-default key alist &optional test default

この関数は、keyにたいするマッチをalistから検索します。alistの各要素にたいして、この関数は、keyと要素(アトムの場合)、または要素のCAR(コンスの場合)を比較します。比較はtestに2つの引数 — 要素(または要素のCAR)とkey — を与えて呼び出すことにより行なわれます。引数はこの順番で渡されるので、正規表現(Regular Expression Searchingを参照してください)を含むalistでは、string-matchを使用することにより有益な結果を得ることができます。testが省略されているかnilの場合は、比較にequalが使用されます。

alistの要素がこの条件によりkeyとマッチした場合、assoc-defaultはこの要素の値をreturnします。要素がコンスの場合、値は要素のCDRです。それ以外の場合、return値はdefaultです。

keyにマッチする要素がalistに存在しない場合、assoc-defaultnilをreturnします。

Function: copy-alist alist

この関数は、深さ2がレベルのalistのコピーをreturnします。この関数は各連想の新しいコピーを作成するので、元のalistを変更せずに、新しいalistを変更できます。

(setq needles-per-cluster
      '((2 . ("Austrian Pine" "Red Pine"))
        (3 . ("Pitch Pine"))
        (5 . ("White Pine"))))
⇒
((2 "Austrian Pine" "Red Pine")
 (3 "Pitch Pine")
 (5 "White Pine"))

(setq copy (copy-alist needles-per-cluster))
⇒
((2 "Austrian Pine" "Red Pine")
 (3 "Pitch Pine")
 (5 "White Pine"))

(eq needles-per-cluster copy)
     ⇒ nil
(equal needles-per-cluster copy)
     ⇒ t
(eq (car needles-per-cluster) (car copy))
     ⇒ nil
(cdr (car (cdr needles-per-cluster)))
     ⇒ ("Pitch Pine")
(eq (cdr (car (cdr needles-per-cluster)))
    (cdr (car (cdr copy))))
     ⇒ t

以下の例は、どのようにしてcopy-alistが他に影響を与えずにコピーの連想を変更可能なのかを示します:

(setcdr (assq 3 copy) '("Martian Vacuum Pine"))
(cdr (assq 3 needles-per-cluster))
     ⇒ ("Pitch Pine")
Function: assq-delete-all key alist

この関数は、alistから、(delqを使用した場合は、そのような要素を1つずつ削除するのにたいして)CARkeyeqな要素すべてを削除します。この関数は短くなったalistをreturnし、alistの元のリスト構造を変更することもよくあります。正しい結果を得るために、alistに保存された値ではなく、assq-delete-allのreturn値を使用してください。

(setq alist '((foo 1) (bar 2) (foo 3) (lose 4)))
     ⇒ ((foo 1) (bar 2) (foo 3) (lose 4))
(assq-delete-all 'foo alist)
     ⇒ ((bar 2) (lose 4))
alist
     ⇒ ((foo 1) (bar 2) (lose 4))
Function: rassq-delete-all value alist

この関数は、alistからCDRvalueeqなすべての要素を削除します。この関数は短くなったリストをreturnし、alistの元のリスト構造を変更することもよくあります。rassq-delete-allassq-delete-allと似ていますが、CARではなくalistの各連想のCDRを比較します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.9 Property Lists

プロパティーリスト(property list。短くはplist)は、ペアになった要素のリストです。各ペアはプロパティー名(通常はシンボル)とプロパティー値を対応づけます。以下はプロパティーリストの例です:

(pine cones numbers (1 2 3) color "blue")

このプロパティーリストは、pineconesnumbers(1 2 3)color"blue"に関連づけます。プロパティー名とプロパティー値には任意のLispオブジェクトを指定できますが、通常プロパティー名は(この例のように)シンボルです。

いくつかのコンテキストでプロパティーリストが使用されます。たとえば、関数put-text-propertyはプロパティーリストを引数にとり、文字列またはバッファー内のテキストにたいして、テキストプロパティーと、テキストに適用するプロパティー値を指定します。Text Propertiesを参照してください。

プロパティーリストが頻繁に使用される他の例は、シンボルプロパティーの保管です。すべてのシンボルは、シンボルに関する様々な情報を記録するために、プロパティーのリストを処理します。これらのプロパティーはプロパティーリストの形式で保管されます。Symbol Propertiesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.9.1 Property Lists and Association Lists

連想リスト(Association Listsを参照してください)は、プロパティーリストとよく似ています。連想リストとは対照的に、プロパティー名は一意でなければならないので、プロパティーリスト内でペアの順序に意味はありません。

様々なLisp関数や変数に情報を付加するためには、連想リストよりプロパティーリストの方が適しています。プログラムでこのような情報すべてを1つの連想リストに保持する場合、特定のLisp関数や変数にたいする連想をチェックする度に、リスト全体を検索する必要が生じ、それにより遅くなる可能性があります。対照的に、関数名や変数自体のプロパティーリストに同じ情報を保持すれば、検索ごとにそのプロパティーリストの長さだけを検索するようになり、通常はこちらの方が短い時間で済みます。変数のドキュメントがvariable-documentationという名前のプロパティーに記録されているのは、これが理由です。同様にバイトコンパイラーも、特別に扱う必要がある関数を記録するためにプロパティーを使用します。

連想リストにも独自の利点があります。アプリケーションに依存しますが、プロパティーを更新するより、連想リストの先頭に連想を追加する方が速いでしょう。シンボルにたいするすべてのプロパティーは同じプロパティーリストに保管されるので、プロパティー名を異なる用途のために使用すると衝突の可能性があります(この理由により、そのプログラムで通常の変数や関数の名前につけるプレフィクスをプロパティー名の先頭につけることにより、一意と思われるプロパティー名を選ぶのはよいアイデアです)。連想リストは、連想をリストの先頭にpushし、後にある連想は無視されるので、スタックと同様に使用できます。これはプロパティーリストでは不可能です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.9.2 Property Lists Outside Symbols

以下の関数はプロパティーリストを操作するために使用されます。これらの関数はすべて、プロパティー名の比較にeqを使用します。

Function: plist-get plist property

この関数は、プロパティーリストplistに保管された、プロパティーpropertyの値をreturnします。この関数には、変形された(malformed)plist引数を指定できます。plistpropertyが見つからなかった場合、この関数はnilをreturnします。たとえば、

(plist-get '(foo 4) 'foo)
     ⇒ 4
(plist-get '(foo 4 bad) 'foo)
     ⇒ 4
(plist-get '(foo 4 bad) 'bad)
     ⇒ nil
(plist-get '(foo 4 bad) 'bar)
     ⇒ nil
Function: plist-put plist property value

この関数は、プロパティーリストplistに、プロパティーpropertyの値として、valueを保管します。この関数はplistを破壊的に変更するかもしれず、元のリスト構造を変更せずに新しいリストを構築することもあります。この関数は変更されたプロパティーリストをreturnするので、plistを取得した場所に書き戻すことができます。たとえば、

(setq my-plist '(bar t foo 4))
     ⇒ (bar t foo 4)
(setq my-plist (plist-put my-plist 'foo 69))
     ⇒ (bar t foo 69)
(setq my-plist (plist-put my-plist 'quux '(a)))
     ⇒ (bar t foo 69 quux (a))
Function: lax-plist-get plist property

plist-getと同様ですが、プロパティーの比較にeqではなくequalを使用します。

Function: lax-plist-put plist property value

plist-putと同様ですが、プロパティーの比較にeqではなくequalを使用します。

Function: plist-member plist property

この関数は与えられたpropertyplistに含まれる場合は、非nilをreturnします。plist-getとは異なり、この関数は存在しないプロパティーと、値がnilのプロパティーを区別できます。実際にreturnされる値は、carpropertyで始まる、plistの後尾部分です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6 Sequences, Arrays, and Vectors

シーケンス(sequence)型は、2つの異なるLisp型 — リストと配列 — を結合した型です。他の言い方をすると、任意のリストはシーケンスであり、任意の配列はシーケンスです。すべてのシーケンスがもつ共通な属性は、それぞれが順序づけされた要素のコレクションであることです。

配列(array)は各スロットが要素である、固定長のオブジェクトです。すべての要素に一定時間でアクセスできます。配列の4つの型として、文字列、ベクター、文字テーブル、ブールベクターがあります。

リストは要素のシーケンスですが、要素は単一の基本オブジェクトではありません。リストはコンスセルにより作られ、要素ごとに1つのセルをもちます。n番目の要素を探すには、n個のコンスセルを走査する必要があるので、先頭から離れた要素ほどアクセスに時間を要します。しかしリストは要素の追加や削除が可能です。

以下の図は、これらの型の関連を表します:

          _____________________________________________
         |                                             |
         |          Sequence                           |
         |  ______   ________________________________  |
         | |      | |                                | |
         | | List | |             Array              | |
         | |      | |    ________       ________     | |
         | |______| |   |        |     |        |    | |
         |          |   | Vector |     | String |    | |
         |          |   |________|     |________|    | |
         |          |  ____________   _____________  | |
         |          | |            | |             | | |
         |          | | Char-table | | Bool-vector | | |
         |          | |____________| |_____________| | |
         |          |________________________________| |
         |_____________________________________________|

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.1 Sequences

このセクションでは、任意の種類のシーケンスを許す関数を説明します。

Function: sequencep object

この関数は、objectがリスト、ベクター、文字列、ブールベクター、文字テーブルの場合はt、それ以外はnilをreturnします。

Function: length sequence

この関数は、sequence内の要素の数をreturnします。sequenceがドットリストの場合、wrong-type-argumentエラーがシグナルされます。循環リストは無限ループを引き起こします。文字テーブルでは、Emacsの最大文字コードより、常に1大きい値がreturnされます。

関連する関数safe-lengthについては、Definition of safe-lengthを参照してください。

(length '(1 2 3))
    ⇒ 3
(length ())
    ⇒ 0
(length "foobar")
    ⇒ 6
(length [1 2 3])
    ⇒ 3
(length (make-bool-vector 5 nil))
    ⇒ 5

Text Representationsstring-bytesも参照してください。

ディスプレー上での文字列の幅を計算する必要がある場合、文字数だけを数えて各文字のディスプレー幅を計算しないlengthではなく、string-width (Size of Displayed Textを参照してください)を使用するべきです。

Function: elt sequence index

この関数は、indexによりインデックスづけされた、sequenceの要素をreturnします。indexの値として妥当なのは、0からsequenceの長さより1小さい数までの範囲の整数です。sequenceがリストの場合、範囲外の値はnthと同じように振る舞います。Definition of nthを参照してください。それ以外の場合、範囲外の値はargs-out-of-rangeエラーを引き起こします。

(elt [1 2 3 4] 2)
     ⇒ 3
(elt '(1 2 3 4) 2)
     ⇒ 3
;; eltがどの文字をreturnするか明確にするためにstringを使用。
(string (elt "1234" 2))
     ⇒ "3"
(elt [1 2 3 4] 4)
     error→ Args out of range: [1 2 3 4], 4
(elt [1 2 3 4] -1)
     error→ Args out of range: [1 2 3 4], -1

この関数は、aref (Functions that Operate on Arraysい)とnth (Definition of nthを参照してください)を一般化したものです。

Function: copy-sequence sequence

この関数は、sequenceのコピーをreturnします。コピーは元のシーケンスと同じ型で、同じ要素が同じ順番でもちます。

コピーに新しい要素を格納するのは、元のsequenceに影響を与えず、その逆も真です。しかし新しいシーケンス内の要素がコピーされたものでない場合は、元のシーケンスの要素と同一(eq)になります。したがって、コピーされたシーケンスを通じて見つかった要素を変更すると、この変更は元のシーケンスでも見ることができます。

シーケンスがテキストプロパティーをともなう文字列の場合、コピー内のプロパティーリスト自身もコピーとなり、元のシーケンスのプロパティーリストと共有はされません。しかし、プロパティーリストの実際の値は共有されます。Text Propertiesを参照してください。

この関数は、ドットリストでは機能しません。循環リストのコピーは、無限ループを起こすでしょう。

シーケンスをコピーする別の方法は、Building Cons Cells and ListsappendCreating StringsconcatFunctions for Vectorsvconcatも参照してください。

(setq bar '(1 2))
     ⇒ (1 2)
(setq x (vector 'foo bar))
     ⇒ [foo (1 2)]
(setq y (copy-sequence x))
     ⇒ [foo (1 2)]
(eq x y)
     ⇒ nil
(equal x y)
     ⇒ t
(eq (elt x 1) (elt y 1))
     ⇒ t
;; 一方のシーケンスの要素を置き換え。
(aset x 0 'quux)
x ⇒ [quux (1 2)]
y ⇒ [foo (1 2)]
;; 共有された要素の内部を変更。
(setcar (aref x 1) 69)
x ⇒ [quux (69 2)]
y ⇒ [foo (69 2)]

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 Arrays

配列(array)オブジェクトは、いくつかのLispオブジェクトを保持するスロットをもち、これらのオブジェクトは配列の要素と呼ばれます。配列内の任意の要素は、一定時間でアクセスされます。対照的に、リスト内の要素のアクセスに要する時間は、その要素がリスト内のどの位置にあるかに比例します。

Emacsは4つの配列型 —文字列(strings。String Typeを参照してください)ベクター(vectors。Vector Typeを参照してください)ブールベクター(bool-vectors。Bool-Vector Typeを参照してください)文字テーブル(char-tables。Char-Table Typeを参照してください) — を定義し、これらはすべて1次元です。ベクターと文字テーブルは任意の型の要素を保持できますが、文字列は文字だけ、ブールベクターはtnilしか保持できません。

4種のすべての配列は、これらの特性を共有します:

配列を作成したとき、文字テーブル以外では、長さを指定しなければなりません。文字テーブルの長さは、文字コードの範囲により決定されるので、長さを指定できません。

原則として、テキスト文字の配列が欲しい場合は、文字列とベクターのどちらかを使用できます。実際のところ、そのような用途にたいしては、4つの理由により、わたしたちは常に文字列を選択します:

対照的に、(キーシーケンスのような)キーボード入力文字の配列では、多くのキーボード入力文字は、文字列に収まる範囲の外にあるので、ベクターが必要になるでしょう。Key Sequence Inputを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.3 Functions that Operate on Arrays

このセクションでは、すべての型の配列に適用される関数を説明します。

Function: arrayp object

この関数は、objectが配列(ベクター、文字列、ブールベクター、文字テーブル)の場合は、tをreturnします。

(arrayp [a])
     ⇒ t
(arrayp "asdf")
     ⇒ t
(arrayp (syntax-table))    ;; 文字テーブル。
     ⇒ t
Function: aref array index

この関数は、arrayindex番目の要素をreturnします。1番目の要素のインデクスは0です。

(setq primes [2 3 5 7 11 13])
     ⇒ [2 3 5 7 11 13]
(aref primes 4)
     ⇒ 11
(aref "abcdefg" 1)
     ⇒ 98           ; b’のASCIIコードは98。

Sequencesの関数eltも参照してください。

Function: aset array index object

この関数は、arrayindex番目の要素を、objectにセットします。この関数はobjectをeturnします。

(setq w [foo bar baz])
     ⇒ [foo bar baz]
(aset w 0 'fu)
     ⇒ fu
w
     ⇒ [fu bar baz]
(setq x "asdfasfd")
     ⇒ "asdfasfd"
(aset x 3 ?Z)
     ⇒ 90
x
     ⇒ "asdZasfd"

arrayが文字列でobjectが文字でない場合、結果はwrong-type-argumentエラーになります。この関数は、文字列の挿入で必要な場合は、ユニバイト文字列をマルチバイト文字列に変換します。

Function: fillarray array object

この関数は配列arrayobjectで充填するので、arrayのすべての要素はobjectになります。この関数はarrayをreturnします。

(setq a [a b c d e f g])
     ⇒ [a b c d e f g]
(fillarray a 0)
     ⇒ [0 0 0 0 0 0 0]
a
     ⇒ [0 0 0 0 0 0 0]
(setq s "When in the course")
     ⇒ "When in the course"
(fillarray s ?-)
     ⇒ "------------------"

arrayが文字列でobjectが文字でない場合、結果はwrong-type-argumentエラーになります。

配列と判っているオブジェクトにたいしては、一般的なシーケンス関数copy-sequenceおよびlengthが有用なときが多くあります。Sequencesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4 Vectors

ベクター(vector)とは、任意のLispオブジェクトを要素にもつことができる、一般用途のための配列です(対照的に、文字列の要素は文字だけですStrings and Charactersを参照してください)。Emacsではベクターは、キーシーケンス(Key Sequencesを参照してください)、シンボル検索用のテーブル(Creating and Interning Symbolsを参照してください)、バイトコンパイルされた関数表現の一部(Byte Compilationを参照してください)など、多くの目的で使用されます。

他の配列と同様、ベクターは0基準のインデックスづけを使用し、1番目の要素はインデックス0になります。

ベクターは、角カッコ(square brackets)で囲まれた要素としてプリントされます。したがって、シンボルabaを要素にもつベクターは、[a b a]とプリントされます。Lisp入力として、同じ方法でベクターを記述できます。

文字列や数値と同様に、ベクターは定数として評価され、評価された結果は同じベクターになります。ベクターの要素は評価も確認もされません。Self-Evaluating Formsを参照してください。

以下はこれらの原理を表す例です:

(setq avector [1 two '(three) "four" [five]])
     ⇒ [1 two (quote (three)) "four" [five]]
(eval avector)
     ⇒ [1 two (quote (three)) "four" [five]]
(eq avector (eval avector))
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.5 Functions for Vectors

ベクターに関連した関数をいくつか示します:

Function: vectorp object

この関数は、objectがベクターの場合は、tをreturnします。

(vectorp [a])
     ⇒ t
(vectorp "asdf")
     ⇒ nil
Function: vector &rest objects

この関数は、引数objectsを要素にもつベクターを作成してreturnします。

(vector 'foo 23 [bar baz] "rats")
     ⇒ [foo 23 [bar baz] "rats"]
(vector)
     ⇒ []
Function: make-vector length object

この関数は、objectに初期化されたlength個の要素からなる、新しいベクターをreturnします。

(setq sleepy (make-vector 9 'Z))
     ⇒ [Z Z Z Z Z Z Z Z Z]
Function: vconcat &rest sequences

この関数は、sequencesのすべての要素を含む、新しいベクターをreturnします。引数sequencesは真リスト、ベクター、文字列、ブールベクターです。sequencesが与えられない場合、空のベクターがreturnされます。

値は空のベクター、または任意の既存のベクターとeqではない、新しい空ではないベクターのどちらかです。

(setq a (vconcat '(A B C) '(D E F)))
     ⇒ [A B C D E F]
(eq a (vconcat a))
     ⇒ nil
(vconcat)
     ⇒ []
(vconcat [A B C] "aa" '(foo (6 7)))
     ⇒ [A B C 97 97 foo (6 7)]

vconcat関数は、引数としてバイトコード関数オブジェクトもとることができます。これは、バイトコード関数オブジェクトの内容全体にアクセスするのを容易にするための、特別な機能です。Byte-Code Function Objectsを参照してください。

結合を行なう他の関数については、Mapping FunctionsmapconcatCreating StringsconcatBuilding Cons Cells and Listsappendを参照してください。

append関数は、ベクターを同じ要素をもつリストに変換する方法も提供します:

(setq avector [1 two (quote (three)) "four" [five]])
     ⇒ [1 two (quote (three)) "four" [five]]
(append avector nil)
     ⇒ (1 two (quote (three)) "four" [five])

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.6 Char-Tables

文字テーブル(char-table)はベクターとよく似ていますが、文字テーブルは文字コードによりインデックスづけされます。文字テーブルのインデックスには、修飾キーをともなわない任意の有効な文字コードを使用できます。他の配列と同様に、arefasetで、文字テーブルの要素にアクセスできます。加えて、文字テーブルは、追加のデータを保持するために、特定の文字コードに関連づけられていない、エキストラスロット(extra slots)をもつことができます。ベクターと同様、文字テーブルは、定数として評価され、任意の型の要素を保持できます。

文字テーブルはそれぞれサブタイプ(subtype)をもち、これは2つの目的を担うシンボルです:

文字テーブルは親(parent)をもつことができ、これは他の文字テーブルです。文字テーブルが親をもつ場合、その文字テーブルで特定の文字cにたいしてnilが指定されているときは、親として指定された文字テーブルで指定された値を継承します。言い方を変えると、文字テーブルchar-tablecnilが指定されている場合、(aref char-table c)char-tableの親の値をreturnします。

文字テーブルはデフォルト値(default value)をもつこともできます。デフォルト値をもつとき、文字テーブルchar-tablecにたいしてnil値を指定すると、(aref char-table c)はデフォルト値をreturnします。

Function: make-char-table subtype &optional init

サブタイプsubtype(シンボル)をもつ、新たに作成された文字テーブルをreturnします。各要素はinitに初期化され、デフォルトはnilです。文字テーブルが作成された後で、文字テーブルのサブタイプを変更することはできません。

すべての文字テーブルは、インデックスとなる任意の有効な文字テーブルのための空間をもつので、文字テーブルの長さを指定する引数はありません。

subtypechar-table-extra-slotsシンボルプロパティーをもつ場合、それはその文字列テーブル内のエキストラスロットの数を指定します。値には0から10の整数を指定し、これ以外の場合make-char-tableはエラーとなります。subtypechar-table-extra-slotsシンボルプロパティー(Property Listsを参照してください)をもたない場合、その文字テーブルはエキストラスロットをもちません。

Function: char-table-p object

この関数は、objectが文字テーブルの場合はt、それ以外はnilをreturnします。

Function: char-table-subtype char-table

この関数は、char-tableのサブタイプのシンボルをreturnします。

文字テーブルのデフォルト値にアクセスするための、特別な関数は存在しません。これを行なうには、char-table-rangeを使用します(以下参照)。

Function: char-table-parent char-table

この関数は、char-tableの親をreturnします。親は常に、nil、または他の文字テーブルです。

Function: set-char-table-parent char-table new-parent

この関数は、char-tableの親を、new-parentにセットします。

Function: char-table-extra-slot char-table n

このガン数は、char-tableのエキストラスロットnの内容をreturnします。文字テーブルのエキストラスロットの数は、文字テーブルのサブタイプにより決定されます。

Function: set-char-table-extra-slot char-table n value

この関数は、char-tableのエキストラスロットnに、valueを格納します。

文字テーブルは、1つの文字コードにたいして、1つの要素値(element value)を指定できます。文字テーブルは文字セット全体にたいして値を指定することもできます。

Function: char-table-range char-table range

この関数は、文字範囲rangeにたいして、char-tableで指定された値をreturnします。可能なrangeは以下のとおりです:

nil

デフォルト値への参照。

char

文字charにたいする要素への参照(charは有効な文字コードであると仮定)。

(from . to)

包括的な範囲‘[from..to]’内のすべての文字を参照するコンスセル。

Function: set-char-table-range char-table range value

この関数は、char-table内の文字範囲rangeにたいして値をセットします。可能なrangeは、以下のとおりです:

nil

デフォルト値への参照。

t

文字コード範囲の全体を参照。

char

文字charにたいする要素への参照(charは有効な文字コードであると仮定)。

(from . to)

包括的な範囲‘[from..to]’内のすべての文字を参照するコンスセル。

Function: map-char-table function char-table

この関数は、char-tableの非nil値ではない各要素にたいして、引数functionを呼び出します。functionの呼び出しでは、2つの引数(keyとvalue)が指定されます。keyはchar-table-rangeにたいする可能なrange — 有効な文字か、同じ値を共有する文字範囲を指定するコンスセル(from . to)です。valueは、(char-table-range char-table key)がreturnする値です。

全体的に見て、functionに渡されるkey-valueのペアは、char-tableに格納されたすべての値を表します。

return値はm常にnilです。map-char-table呼び出しを有用にするために、functionは副作用をもつべきです。たとえば、以下は構文テーブルを調べる方法です:

(let (accumulator)
   (map-char-table
    #'(lambda (key value)
        (setq accumulator
              (cons (list
                     (if (consp key)
                         (list (car key) (cdr key))
                       key)
                     value)
                    accumulator)))
    (syntax-table))
   accumulator)
⇒
(((2597602 4194303) (2)) ((2597523 2597601) (3))
 ... (65379 (5 . 65378)) (65378 (4 . 65379)) (65377 (1))
 ... (12 (0)) (11 (3)) (10 (12)) (9 (0)) ((0 8) (3)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.7 Bool-vectors

ブールベクター(bool-vector)はベクターとよく似ていますが、値にtnilしか格納できません。ブールベクターの要素に非nil値の格納を試みた場合、そこにtが格納されます。すべての配列と同様、ブールベクターのインデックスは0から開始され、1度ブールベクターが作成されたら、長さを変更することはできません。ブールベクターは定数として評価されます。

ブールベクターを処理する、特別な関数が2つあります。その関数意外にも、他の種類の配列に使用されるのと同じ関数で、ブールベクターを操作できます。

Function: make-bool-vector length initial

initialに初期化された、length要素の新しいブールベクターをreturnします。

Function: bool-vector-p object

この関数は、objectがブールベクターであればt、それ以外はnilをreturnします。

以下で説明するように、ブールベクターのセット処理を行なう関数がいくつかあります:

Function: bool-vector-exclusive-or a b &optional c

ブールベクターabの、ビットごとの排他的論理和(bitwise exclusive or)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-union a b &optional c

ブールベクターabの、ビットごとの論理和(bitwise or)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-intersection a b &optional c

ブールベクターabの、ビットごとの論理積(bitwise and)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-set-difference a b &optional c

ブールベクターabの、差集合(set difference)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-not a &optional b

ブールベクターaの、補集合(set complement)をreturnします。オプション引数bが与えられた場合、この処理の結果はbに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-subsetp a b

a内のすべてのt値が、bでもt値の場合はt、それ以外はnilをreturnします。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-count-consecutive a b i

iから始まるaの、bと等しい連続する要素の数をreturnします。aはブールベクターで、btniliaのインデックスです。

Function: bool-vector-count-population a

ブールベクターaの、tの要素の数をreturnします。

以下はブールベクターを作成、確認、更新する例です。長さ8以下のブール値のプリント表記は、1つの文字で表されることに注意してください。

(setq bv (make-bool-vector 5 t))
     ⇒ #&5"^_"
(aref bv 1)
     ⇒ t
(aset bv 3 nil)
     ⇒ nil
bv
     ⇒ #&5"^W"

control-_の2進コードは11111、control-Wは10111なので、この結果は理解できるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.8 Managing a Fixed-Size Ring of Objects

リング(ring)は、挿入、削除、ローテーション、剰余(modulo)でインデックスづけされた参照と走査(traversal)をサポートする、固定長のデータ構造です。ringパッケージにより、効率的なリングデータ構造が実装されています。このパッケージは、このセクションにリストされた関数を提供します。

killリングやマークリングのような、Emacsにあるいくつかの“リング”は、実際には単なるリストとして実装されていることに注意してください。したがって、これらのリングにたいしては、以下の関数は機能しないでしょう。

Function: make-ring size

この関数は、sizeオブジェクトを保持できる、新しいリングをreturnします。sizeは整数です。

Function: ring-p object

この関数は、objectがリングの場合はt、それ以外はnilをreturnします。

Function: ring-size ring

この関数は、ringの最大の要素数をreturnします。

Function: ring-length ring

この関数は、ringに現在含まれている、オブジェクトの数をreturnします。値は、ring-sizeでreturnされる値を超えることはありません。

Function: ring-elements ring

この関数は、ring内のオブジェクトのリストをreturnします。リストの順序は、新しいオブジェクトが先頭になります。

Function: ring-copy ring

個の関数は、ringのコピーを新しいリングとしてreturnします。新しいリングは、ringと同じ(eqな)オブジェクトを含みます。

Function: ring-empty-p ring

この関数は、ringが空の場合はt、それ以外はnilをreturnします。

リング内の1番新しい要素は、常にインデックス0をもちます。より大きいインデックスは、より古い要素に対応します。インデックスは、リング長のmoduloにより計算されます。インデックス-1は1番古い要素、-2は次に古い要素、...となります。

Function: ring-ref ring index

この関数はインデックスindexにあるring内のオブジェクトをreturnします。indexには負、またはリング長より大きい数を指定できます。ringがからの場合、ring-refはエラーをシグナルします。

Function: ring-insert ring object

この関数は、1番新しい要素としてobjectringに挿入し、objectをreturnします。

リングが一杯の場合、新しい要素のための空きを作るため、挿入により1番古い要素が削除されます。

Function: ring-remove ring &optional index

ringからオブジェクトを削除して、そのオブジェクトをreturnします。引数indexは、どのアイテムを削除するかを指定します。これがnilの場合、それは1番古いアイテムを削除することを意味します。ringが空の場合、ring-removeはエラーをシグナルします。

Function: ring-insert-at-beginning ring object

この関数は、1番古い要素として、objectringに挿入します。return値は、意味をもちません。

リングが一杯の場合、この関数は挿入される要素のための空きを作るために、1番新しい要素を削除します。

リングサイズを超えることを気にしない場合、そのリングをFIFO(first-in-first-out: 先入れ先出し)のキューとして使用することができます。たとえば:

(let ((fifo (make-ring 5)))
  (mapc (lambda (obj) (ring-insert fifo obj))
        '(0 one "two"))
  (list (ring-remove fifo) t
        (ring-remove fifo) t
        (ring-remove fifo)))
     ⇒ (0 t one t "two")

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7 Hash Tables

ハッシュテーブル(hash table)は、非常に高速なルックアップテーブルの一種で、キーを対応する値にマップするという点では、alist(Association Listsを参照してください)に似ています。ハッシュテーブルは、以下の点でalistと異なります:

Emacs Lispは、それらを処理する一連の関数とともに、一般的な用途のハッシュテーブルデータ型を提供します。ハッシュテーブルは特別なプリント表現をもち、それは‘#s’と、その後にハッシュテーブルのプロパティーと内容お指定するリストが続きます。Creating Hash Tablesを参照してください。(用語“ハッシュ表記(hash notation)”は、プリント表現の最初に‘#’を使用する、入力構文をもたないオブジェクトのことを指し、これは用語“ハッシュテーブル(hash table)”にたいしては使用されません。Printed Representation and Read Syntaxを参照してください。)

obarray(オブジェクト配列)もハッシュテーブルの一種ですが、これらは異なる型のオブジェクトで、intern(インターン)されたシンボルを記録するためだけに使用されます(Creating and Interning Symbolsを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.1 Creating Hash Tables

ハッシュテーブルを作成する基本的な関数は、make-hash-tableです。

Function: make-hash-table &rest keyword-args

この関数は、指定された引数に対応する、新しいハッシュテーブルを作成します。引数は、キーワード(特別に認識される独自のシンボル)と、それに対応する値を交互に指定することにより構成されます。

make-hash-tableでは、いくつかのキーワードが意味をもちますが、実際に知る必要があるのは、:test:weaknessの2つだけです。

:test test

これは、このハッシュテーブルにたいしてキーを照合する方法を指定します。デフォルトはeqlであり、他の代替としてはeqequalがあります:

eql

キーが数字の場合、それらがequalであれば、つまり、それらの値が等しく、どちらも整数、あるいはどちらも浮動少数の場合は“同一”です。それ以外では、2つの別々のオブジェクトは、決して“同一”になりません。

eq

2つの個別のLispオブジェクトはすべて、“別”のキーです。

equal

2つの個別のLispオブジェクトにたいして、それらがequalの場合、“同一”のキーです。

testにたいして追加の選択肢を定義するために、define-hash-table-test (Defining Hash Comparisonsを参照してください)を使用することができます。

:weakness weak

ハッシュテーブルのweakness(強度)は、ハッシュテーブル内に存在するキーと値を、ガーベージコレクションから保護するかどうかを指定します。

weakは、nilkeyvaluekey-or-valuekey-and-value、またはt(key-and-valueのエイリアス)のうちの1つを指定しなければなりません。weakkeyの場合、そのハッシュテーブルは、(キーが他の場所で参照されていなければ)ハッシュテーブルのキーがガーベージコレクトされるのを妨げません。ある特定のキーがガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。

weakvalueの場合、そのハッシュテーブルは、(値が他の場所で参照されていなければ)ハッシュテーブルの値がガベージコレクトされるのを妨げません。あるP特定の値がガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。

weakkey-and-value(またはt)の場合、その連想を保護するために、キーと値の両方が生きていなければなりません。したがって、そのハッシュテーブルは、キーと値のどちらかをガーベージコレクトから守ることはしません。キーか値のどちらか一方がガーベージコレクトされたら、その連想は削除されます。

weakkey-or-valueの場合、キーか値のどちらか一方で、その連想を保護することができます。したがって、キーと値の両方がガベージコレクトされたときだけ(それがハッシュテーブル自体にたいする参照でなければ)、ハッシュテーブルからその連想が削除されます。

weakにたいするデフォルトはnilなので、ハッシュテーブルから参照されているキーと値のすべては、ガーベージコレクションから保護されます。

:size size

これは、そのハッシュテーブルに連想を保管しようと計画している、連想の数にたいするヒントを指定します。数が概算で判っている場合、この方法でそれを指定することにより、処理を少し効率的にすることができます。小さすぎるサイズを指定した場合、そのハッシュテーブルは必要に応じて自動的に拡張子マスが、これを行なうには時間が余計にかかります。

デフォルトのサイズは65です。

:rehash-size rehash-size

ハッシュテーブルに連想を追加するとき、そのテーブルが“一杯(full)”の場合、テーブルは自動的に拡張します。この値は、そのときどれだけハッシュテーブルを拡張するかを指定します。

rehash-sizeが整数の場合(それは正であるべきです)、通常のサイズにrehash-sizeを加えることにより、ハッシュテーブルが拡張されます。rehash-sizeが浮動小数の場合(1より大きい方がよい)は、古いサイズにその数を乗じることにより、ガッシュテーブルが拡張されます。

デフォルト値は1.5です。

:rehash-threshold threshold

これは、ハッシュテーブルが“一杯(full)”(なのでもっと大きく拡張する必要がある)だと判断される基準を指定します。thresholdの値は、1以下の、正の浮動小数点数であるべきです。実際のエントリー数が、通常のサイズにたいする指定した割合を超えた場合、そのハッシュテーブルは“一杯”になります。thresholdのデフォルトは、0.8です。

Function: makehash &optional test

この関数はmake-hash-tableと同じですが、異なるスタイルの引数リストを指定します。引数testは、キーを照合する方法を指定します。

この関数は時代遅れです。かわりにmake-hash-tableを使用してください。

ハッシュテーブルのプリント表現を使用して、新しいハッシュテーブルを作成することもできます。指定されたハッシュテーブル内の各要素が、有効な入力構文(Printed Representation and Read Syntaxを参照してください)をもっていれば、Lispリーダーをこのプリント表現を読み取ることができます。たとえば以下は、値val1(シンボル)と300(数字)に関連づけられた、キーkey1key2(両方ともシンボル)を、新しいハッシュテーブルを指定します。

#s(hash-table size 30 data (key1 val1 key2 300))

ハッシュテーブルのプリント表現は、‘#s’と、その後の‘hash-table’で始まるリストにより構成されます。このリストの残りの部分は、そのハッシュテーブルのプロパティーと初期内容を指定する、0個以上のプロパティーと値のペアで構成されるべきです。プロパティーと値は、そのまま読み取られます。有効なプロパティー名は、sizetestweaknessrehash-sizerehash-threshold、およびdataです。dataプロパティーは、初期ないようにたいするキーと値のペアのリストであるべきです。他のプロパティーは、上記で説明したmake-hash-tableのキーワード(:size:testなど)と同じ意味をもちます。

バッファーやフレームのような、入力構文をもたないオブジェクトを含む初期内容をもつハッシュテーブルを指定できないことに注意してください。そのようなオブジェクトは、ハッシュテーブルが作成された後に追加します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.2 Hash Table Access

このセクションでは、ハッシュテーブルにアクセスしたり、連想を保管する関数を説明します。一般的に、比較方法による制限がない限り、任意のLispオブジェクトをハッシュキーとして使用できます。

Function: gethash key table &optional default

この関数はtablekeyを照合して、それに関連づけられたvaluetable内にkeyをもつ連想が存在しない場合はdefault — をreturnします。

Function: puthash key value table

この関数は、table内に、値valueをもつkeyの連想を挿入します。tableがすでにkeyの連想をもつ場合、valueにより古い連想値が置き換えられます。

Function: remhash key table

この関数は、tablekeyの連想がある場合は、それを削除します。keyが連想をもたない場合、remhashは何も行ないません。

Common Lispに関する注意: Common Lispでは、remhashが実際に連想を削除したときは非nil、それ以外はnilをreturnします。Emacs Lispでは、remhashは常にnilをreturnします。

Function: clrhash table

この関数は、ハッシュテーブルtableからすべての連想を削除するので、そのハッシュテーブルは空になります。これはハッシュテーブルのクリーニング(clearing)とも呼ばれます。

Common Lispに関する注意: Common Lispでは、clrhashは空のtableをreturnします。Emacs Lispではnilをreturnします。

Function: maphash function table

この関数は、table内の各連想にたいして、1度ずつfunctionを呼び出します。関数functionは2つの引数 — tableにリストされたkeyと、それに関連づけられたvalue — をとるべきです。maphashnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.3 Defining Hash Comparisons

define-hash-table-testにより、キーを照合する新しい方法を定義できます。この機能を使用するには、ハッシュテーブルの動作方法と、ハッシュコード(hash code)の意味を理解する必要があります。

概念的にはハッシュテーブルを、1つの連想を保持できるスロットがたくさんある巨大な配列として考えることができます。キーを照合するには、まずgethashが、キーから整数のハッシュコード(hash code)を計算します。配列内のインデックスを生成するために、gethashは、配列の長さにより、この整数のmoduloを得ます。それからキーが見つかったかどうか確認するために、そのスロット、もし必要なら近くのスロットを探します。

したがってキー照合の新しい方法を定義するためには、キーからハッシュコードを計算する関数と、2つのキーを直接比較する関数の両方が必要です。

Function: define-hash-table-test name test-fn hash-fn

この関数は、nameという名前の、新たなハッシュテーブルテストを定義します。

この方法でnameを定義した後では、make-hash-tableの引数testにこれを使用することができます。それを行なう場合、そのハッシュテーブルはキー値の比較にtest-fn、キー値から“ハッシュコード”を計算するためにhash-fnを使用することになります。

関数test-fnは2つの引数(2つのキー)をとり、それらが“同一”と判断されたときは非nilをreturnします。

関数hash-fnは1つの引数(キー)をとり、そのキーの“ハッシュコード”(整数)をreturnします。よい結果を得るために、この関数は負の整数を含む整数の全範囲を、ハッシュコードに使用するべきです。

指定された関数は、プロパティーhash-table-testの配下の、nameというプロパティーリストに格納されます。そのプロパティーの値形式は、(test-fn hash-fn)です。

Function: sxhash obj

この関数は、Lispオブジェクトobjにたいするハッシュコードをreturnします。return値は、objと、それが指す別のLispオブジェクトの内容を表す整数です。

2つのオブジェクトobj1obj2がequalの場合、(sxhash obj1)(sxhash obj2)は同じ整数になります。

2つのオブジェクトがequalでない場合、通常はsxhashがreturnする値は異なりますが、常に異なるとは限りません。稀にですが(運次第)、sxhashが同じ結果を与える、2つの異なって見えるオブジェクトに遭遇するかもしれません。

以下は、大の字小文字を区別しない、文字列のキーをもつハッシュテーブルを作成する例です。

(defun case-fold-string= (a b)
  (eq t (compare-strings a nil nil b nil nil t)))
(defun case-fold-string-hash (a)
  (sxhash (upcase a)))

(define-hash-table-test 'case-fold
  'case-fold-string= 'case-fold-string-hash)

(make-hash-table :test 'case-fold)

以下は、事前に定義されたテスト値equalと等価なテストを行なうハッシュテーブルを定義できるという例です。キーは任意のLispオブジェクトで、equalに見えるオブジェクトは、同じキーと判断されます。

(define-hash-table-test 'contents-hash 'equal 'sxhash)

(make-hash-table :test 'contents-hash)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.4 Other Hash Table Functions

以下は、ハッシュテーブルに機能する他の関数です。

Function: hash-table-p table

この関数は、tableがハッシュテーブルオブジェクトの場合は、非nilをreturnします。

Function: copy-hash-table table

この関数は、tableのコピーを作成してreturnします。そのテーブル自体がコピーされたものである場合だけ、キーと値が共有されます。

Function: hash-table-count table

この関数はtable内の実際のエントリー数をreturnします。

Function: hash-table-test table

この関数は、ハッシュを行なう方法と、キーを比較する方法を指定するために、tableが作成されたときに与えられたtestの値をreturnします。Creating Hash Tablesmake-hash-tableを参照してください。

Function: hash-table-weakness table

この関数は、ハッシュテーブルtableに指定されたweakの値をreturnします。

Function: hash-table-rehash-size table

この関数は、tableのrehash-sizeをreturnします。

Function: hash-table-rehash-threshold table

この関数は、tableのrehash-thresholdをreturnします。

Function: hash-table-size table

この関数は、tableの現在の定義されたサイズをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8 Symbols

シンボル(symbol)は、一意な名前をもつオブジェクトです。このチャプターでは、シンボル、シンボルの構成要素やプロパティーリスト、およびシンボルを作成、インターンする方法を説明します。別のチャプターでは、シンボルを変数として使用したり、関数名として使用する方法が説明されています。VariablesFunctionsを参照してください。シンボルの正確な入力構文については、Symbol Typeを参照してください。

任意のLispオブジェクトがシンボルかどうかを、symbolpでテストできます:

Function: symbolp object

この関数は、objectがシンボルの場合はt、それ以外はnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.1 Symbol Components

各シンボルは4つの構成要素(もしくは“セル”)をもち、各構成要素はそれぞれ別のオブジェクトを参照します:

プリント名(print name)

そのシンボルの名前。

値(value)

そのシンボルの、変数としての現在の値。

関数(function)

そのシンボルの関数定義。これはシンボル、キーマップ、キーボードマクロも保持できる。

プロパティーリスト(property list)

そのシンボルのプロパティーリスト。

プリント名のセルは常に文字列を保持し、それを変更することはできません。他の3つのセルには、任意のLispオブジェクトをセットすることができます。

プリントメイのセルは、シンボルの名前となる文字列を保持します。シンボルは、シンボル名によりテキストとして表されるので、2つのシンボルが同じな前をもたないことが重要です。Lispリーダーは、シンボルを読み取るごとに、新たにそれを作成する前に、指定されたシンボルがすでに存在するか調べます。シンボルの名前を得るには、関数symbol-name(Creating and Interning Symbolsを参照してください)を使用します。

値のセルは、シンボルの変数としての値(そのシンボル自身がLisp式として評価されたときに得る値)を保持します。ローカルバインディング(local binding)スコーピングルール(scoping rules)などのような複雑なものを含め、変数がセットされたり、取得される方法については、See section Variablesを参照してください。ほとんどのシンボルは、値として任意のLispオブジェクトをもつことができますが、一部の特別なシンボルは変更できない値をもちます。これらには、nilt、および名前が‘:’で始まる任意のシンボル(キーワード(keyword)と呼ばれます)が含まれます。Variables that Never Changeを参照してください。

関数のセルは、シンボルの関数定義を保持します。実際は、fooの関数セルの中に保管されている関数を意味するとき、“関数foo”といってそれを参照することがよくあります。わたしたちは、必要な土岐だけ、これを明確に区別することにします。関数セルは通常、関数(Functionsを参照してください)か、マクロ(Macrosを参照してください)を保持するために使用されます。しかし、関数セルはシンボル(Symbol Function Indirectionを参照してください)、キーボードマクロ(see section Keyboard Macros)、キーマップ(see section Keymaps)、またはオートロードオブジェクト(Autoloadingを参照してください)を保持するためにも使用できます。シンボルの関数セルの内容を得るには、関数symbol-function (Accessing Function Cell Contentsを参照してください)を使用します。

プロパティーリストのセルは通常、正しくフォーマットされたプロパティーリストを保持するべきです。シンボルのプロパティーリストを得るには、関数symbol-plistを使用します。Symbol Propertiesを参照してください。

巻子失せると値セルが、void(空)のときもあります。voidとは、そのセルがどのオブジェクトも参照していないことを意味します(これは、シンボルvoidを保持することとは異なり、シンボルnilを保持することとも異なります)。voidの関数セルまたは値セルを調べようとすると、結果は‘Symbol's value as variable is void’のようなエラーとなります。

それぞれのシンボルは値セルと関数セルを別個にもつので、変数名と関数名が衝突することはありません。たとえば、シンボルbuffer-file-nameが、値(カレントバッファーでvisitされているファイルの名前)をもち、同様に関数定義(ファイルの名前をreturnする基本関数)をもつことができます:

buffer-file-name
     ⇒ "/gnu/elisp/symbols.texi"
(symbol-function 'buffer-file-name)
     ⇒ #<subr buffer-file-name>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.2 Defining Symbols

定義(definition)とは、特別な方法で使用を意図することを宣言する、特別な種類のLisp式です。定義とは通常、シンボルにたいする値を指定するか、シンボルにたいする1つの種類の使用についての意味と、この方法で使用するときのシンボルの意味にたいするドキュメントを指定します。したがって、シンボルを変数として定義した場合、その変数の初期値と、加えてその変数のドキュメントを提供できます。

defvarおよびdefconstは、グローバル変数(global variable) — Lispプログラムの任意の箇所からアクセスできる変数 — として定義するスペシャルフォームです。変数についての詳細は、Variablesを参照してください。カスタマイズ可能な変数を定義するには、defcustom(これはサブルーチンとしてdefvarも呼び出します)を使用します(Customization Settingsを参照してください)。

原則として、最初にシンボルが変数として定義されていなくても、setqで任意のシンボルに値を割り当てることができます。しかし、使用したいそれぞれのグローバル変数にたいして、変数定義を記述するべきです。さもないと、レキシカルスコープ(Scoping Rules for Variable Bindingsを参照してください)が有効なときに変数が評価された場合、あなたのLispプログラムは正しく動作しないでしょう。

defunは、ラムダ式(lambda expression)を生成して、そのシンボルの関数セルにそれを格納することにより、シンボルを関数として定義します。したがって、このシンボルの関数定義は、このラムダ式になります(関数セルの内容を意味する用語“関数定義(function definition)”は、defunがシンボルに関数としての定義を与えるというアイデアに由来します)。Functionsを参照してください。

defmacroは、シンボルをマクロとして定義します。これはマクロオブジェクトを作成して、そのシンボルの関数セルにそれを格納します。シンボルにはマクロと関数を与えることができますが、マクロと関数定義はどちらも関数セルに保持されるのにたいし、関数セルに保持できるのは常にただ1つのLispオブジェクトなので、両方1度にそれを行なうことはできないことに注意してください。Macrosを参照してください。

前に注記したように、Emacs Lispではシンボルを(たとえばdefvarで)変数として定義して、同じシンボルを(たとえばdefunで)関数やマクロとして、両方定義することができます。このような定義は衝突しません。

これらの定義は、プログラミングツールのガイドを果たすこともできます。たとえば、C-h fおよびC-h vコマンドは、関係ある変数、関数、マクロ定義へのリンクを含むヘルプバッファーを作成します。Name Help in The GNU Emacs Manualを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.3 Creating and Interning Symbols

GNU Emacs Lispでシンボルが作成される方法を理解するには、Lispがシンボルを読み取る方法を理解しなければなりません。Lispは、同じ文字綴りを読み取ったら、毎回同じシンボルを見つけることを保証しなければなりません。これに失敗すると、完全な混乱を招くでしょう。

Lispリーダーがシンボルに出会うと、Lispリーダーは名前のすべての文字を読み取ります。その後Lispリーダーは、obarray(オブジェクト配列)と呼ばれるテーブル内のインデックスを決めるために、これらの文字を“ハッシュ(hash)”します。ハッシュ化(hashing)は何かを照合するのに効果的な方法です。たとえば、Jan Jonesを見つけるときは、電話帳を表紙から1頁ずつ探すのではなく、Jから探し始めます。これは簡単なバージョンのハッシュ化です。obarrayの各要素は、与えられたハッシュコードとともにすべてのシンボルを保持する、バケット(bucket)です。与えられた名前を探すためには、バケットの中からその名前のハッシュコードのすべてのシンボルを探すのが効果的です(同じアイデアは一般的なEmacsのハッシュテーブルでも使用されていますが、これらは異なるデータ型です。Hash Tablesを参照してください)。

探している名前のシンボルが見つかったら、リーダーはそのシンボルを使用します。obarrayにその名前のシンボルが含まれない場合、リーダーは新しいシンボルを作成して、それをobarrayに追加します。特定の名前のシンボルを探して追加することを、インターン(intern)すると言い、これが行なわれた後、そのシンボルはインターンされたシンボル(interned symbol)と呼ばれます。

インターンすることにより、ある特定の名前のシンボルは、それぞれのobarrayに1つだけであることが保証されます。同じ名前のシンボルは他に存在するかもしれませんが、同じobarrayではありません。したがってリーダーは、(同じobarrayを読みつづける限り)同じ名前にたいして、同じシンボルを取得します。

インターンは通常、リーダー内で自動的に発生しますが、他のプログラムがこれを行なう必要がある場合もあります。たとえば、M-xコマンドは、その後ミニバッファーを使用してコマンド名を文字列として取得し、その文字列をインターンして、インターンされたその名前のシンボルを得ます。

すべてのシンボルを含むobarrayはありません。実際、どのobarrayにも含まれないシンボルがいくつかあります。これらは、インターンされていないシンボル(uninterned symbols)と呼ばれます。インターンされていないシンボルも、他のシンボルと同じく4つのセルをもちます。しかし、インターンされていないシンボルへのアクセスを得る唯一の方法は、他の何らかのオブジェクトとして探すか、変数の値として探す方法だけです。

インターンされていないシンボルの作成は、Lispコードを生成するとき有用です。なぜなら、作成されたコード内で変数として使用されているインターンされていないシンボルは、他のLispプログラムで使用されている任意の変数と競合することはありえないからです。

Emacs Lispでは、obarrayはベクターです。ベクター内の各要素がバケットになります。要素の値は、名前がそのバケットにハッシュされるインターンされたシンボル、またはバケットが空のときは0です。インターンされたシンボルは、そのバケット内の次のシンボルへの、内部リンク(ユーザーからは見えない)をもちます。これらのリンクは不可視なので、mapatomsを使用する方法をのぞき(以下参照)、obarray内のすべてのシンボルを探す方法はありません。バケット内のシンボルの順番に、意味はありません。

空のobarrayでは、すべての要素が0なので、(make-vector length 0)でobarrayを作成することができます。obarrayを作成する有効な方法は、これだけです。長さに素数を指定すると、よいハッシュ化がされる傾向があります。2の累乗から1減じた長さも、よい結果を生む傾向があります。

自分でobarrayにシンボルを置かないでください。これはうまくいきません — obarrayに正しくシンボルを入力できるのは、internだけです。

Common Lispに関する注意: Common Lispとは異なり、Emacs Lispは1つのシンボルを複数のobarrayにインターンする方法を提供しません。

以下の関数のほとんどは、引数に名前とobarrayをとります。名前が文字列ではない、またはobarrayがベクターでない場合は、wrong-type-argumentエラーがシグナルされます。

Function: symbol-name symbol

この関数は、symbolの名前を文字列としてreturnします。たとえば:

(symbol-name 'foo)
     ⇒ "foo"

警告: 文字の置き換えにより文字列を変更すると、それはシンボルの名前を変更しますが、obarrayの更新には失敗するので、行なわないでください!

Function: make-symbol name

この関数は、新たに割り当てられた、名前がname(文字列でなかればならない)のインターンされていないシンボルをreturnします。このシンボルの値と関数はvoidで、プロパティーリストはnilです。以下の例では、symの値はfooeqではありません。なぜなら、これは名前が‘foo’のインターンされていないシンボルだからです。

(setq sym (make-symbol "foo"))
     ⇒ foo
(eq sym 'foo)
     ⇒ nil
Function: intern name &optional obarray

この関数は、名前がnameの、インターンされたシンボルをreturnします。オブジェクト配列obarrayの中にそのようなシンボルが存在しない場合、internはあたらしいシンボルを作成してobarrayに追加し、それをreturnします。obarrayが省略された場合、グローバル変数obarrayの値が使用されます。

(setq sym (intern "foo"))
     ⇒ foo
(eq sym 'foo)
     ⇒ t

(setq sym1 (intern "foo" other-obarray))
     ⇒ foo
(eq sym1 'foo)
     ⇒ nil

Common Lispに関する注意: Common Lispでは、既存のシンボルをobarrayにインターンできます。Emacs Lispでは、internの引数はシンボルではなく文字列なので、これを行なうことはできません。

Function: intern-soft name &optional obarray

この関数は、obarray内の名前がnameのシンボル、obarrayにその名前のシンボルが存在しない場合はnilをreturnします。したがって、与えられた名前のシンボルがすでにインターンされているかテストするために、intern-softを使用することができます。obarrayが省略された場合は、グローバル変数obarrayの値が使用されます。

引数nameにはシンボルも使用できます。この場合、指定されたobarrayにnameがインターンされていればname、それ以外はnilをreturnします。

(intern-soft "frazzle")        ; そのようなシンボルは存在しない。
     ⇒ nil
(make-symbol "frazzle")        ; インターンされていないシンボルを作成する。
     ⇒ frazzle
(intern-soft "frazzle")        ; そのようなシンボルは見つからない。
     ⇒ nil
(setq sym (intern "frazzle"))  ; インターンされたシンボルを作成する。
     ⇒ frazzle
(intern-soft "frazzle")        ; シンボルが見つかった!
     ⇒ frazzle
(eq sym 'frazzle)              ; そして、それは同じシンボル。
     ⇒ t
Variable: obarray

この変数は、internおよびreadで使用される、標準のobarrayです。

Function: mapatoms function &optional obarray

この関数は、オブジェクト配列obarrayの中のシンボルに1つにたいして、1度ずつfunctionを呼び出し、その後nilをreturnします。obarrayが省略された場合は、通常のシンボルにたいする標準のオブジェクト配列obarrayの値がデフォルトになります。

(setq count 0)
     ⇒ 0
(defun count-syms (s)
  (setq count (1+ count)))
     ⇒ count-syms
(mapatoms 'count-syms)
     ⇒ nil
count
     ⇒ 1871

mapatomsを使用する他の例については、Access to Documentation Stringsdocumentationを参照してください。

Function: unintern symbol obarray

この関数は、オブジェクト配列obarrayから、symbolを削除します。obarrayの中にsymbolが存在しない場合、uninternは何も行ないません。obarraynilの場合は、現在のobarrayが使用されます。

symbolにシンボルではなく文字列を与えた場合、それはシンボルの名前を意味します。この場合、uninternは、(もしあれば)obarrayからその名前のシンボルを削除します。そのようなシンボルが存在する場合、uninternは何も行ないません。

uninternがシンボルを削除した場合はt、それ以外はnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4 Symbol Properties

シンボルは、そのシンボルについての様々な情報を記録するために使用される、任意の数のシンボルプロパティー(symbol properties)をもつことができます。たとえば、シンボルのrisky-local-variableプロパティーがnilの場合は、その変数の名前が、危険なファイルローカル変数(File Local Variablesを参照してください)であることを意味します。

シンボルのプロパティーとプロパティー値はそれぞれ、、シンボルのプロパティーリストセル(Symbol Componentsを参照してください)に、プロパティーリスト形式(Property Listsを参照してください)で格納されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4.1 Accessing Symbol Properties

以下の関数は、シンボルプロパティーへのアクセスに使用できます。

Function: get symbol property

この関数は、symbolのプロパティーリスト内の、propertyという名前のプロパティーの値をreturnします。そのようなプロパティーが存在しない場合は、nilをreturnします。したがって、値がnilのときと、プロパティーが存在しない場合の違いはありません。

名前propertyは、eqを使用して既存のプロパティーと比較されるので、任意のオブジェクトはプロパティーとして適正です。

例はputを参照してください。

Function: put symbol property value

この関数は、symbolのプロパティーリストの、プロパティー名propertyvalueを配して、以前のプロパティー値を置き換えます。put関数は、valueをreturnします。

(put 'fly 'verb 'transitive)
     ⇒'transitive
(put 'fly 'noun '(a buzzing little bug))
     ⇒ (a buzzing little bug)
(get 'fly 'verb)
     ⇒ transitive
(symbol-plist 'fly)
     ⇒ (verb transitive noun (a buzzing little bug))
Function: symbol-plist symbol

この関数は、symbolののののプロパティーリストをreturnします。

Function: setplist symbol plist

この関数は、symbolのプロパティーリストを、plistにセットします。plistは通常、適正なプロパティーリストであるべきですが、これは強制ではありません。return値はplistです。

(setplist 'foo '(a 1 b (2 3) c nil))
     ⇒ (a 1 b (2 3) c nil)
(symbol-plist 'foo)
     ⇒ (a 1 b (2 3) c nil)

通常の用途には使用されない、特別なobarray内のシンボルでは、非標準的で方法でプロパティーリストセルを使用することに意味があるかもしれません。実際に、abbrev(Abbrevs and Abbrev Expansionを参照してください)のメカニズムは、これを行なっています。

以下のように、setplistplist-putにより、putを定義できます:

(defun put (symbol prop value)
  (setplist symbol
            (plist-put (symbol-plist symbol) prop value)))
Function: function-get symbol property

この関数は、getと同じですが、symbolが関数エイリアス(function alias)の場合は、実際の関数の名づけるシンボルのプロパティーリストを参照します。Defining Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4.2 Standard Symbol Properties

以下に、Emacsで特別な目的のために使用されるシンボルプロパティーをリストします。以下の表で、“名づけられた関数(the named function)”と言うときは、関数名がそのシンボルである関数を意味します。“名づけられた変数(the named variable)”などの場合も、同様です。

:advertised-binding

このプロパティーリストは、名づけられた関数のドキュメントを表示するときの、優先されるキーバインディングを指定します。Substituting Key Bindings in Documentationを参照してください。

char-table-extra-slots

値が非nilの場合は、名づけられた文字テーブル型の追加スロットの数を指定します。Char-Tablesを参照してください。

customized-face
face-defface-spec
saved-face
theme-face

これらのプロパティーは、フェイスの標準のフェイススペック(face specs)、およびフォントスペックsaved-fase、customized-face、themed-faceを記録するために使用されます。これらのプロパティーを直接セットしないでください。これらのプロパティーはdefface、および関連する関数により管理されます。Defining Facesを参照してください。

customized-value
saved-value
standard-value
theme-value

これらのプロパティーは、カスタマイズ可能な変数のstandard-value、saved-value、customized-value(しかし保存はされない)、themed-valueを記録するために使用されます。これらのプロパティーを直接セットしないでください。これらはdefcustom、および関連する関数により管理されます。Defining Customization Variablesを参照してください。

disabled

値が非nilの場合、名づけられた関数はコマンドとして無効になります。Disabling Commandsを参照してください。

face-documentation

値には、名づけられたフェイスのドキュメント文字列が格納されます。これは、deffaceにより自動的にセットされます。Defining Facesを参照してください。

history-length

値が非nilの場合、名づけられたヒストリーリスト変数の、ミニバッファーヒストリーの最大長を指定します。Minibuffer Historyを参照してください。

interactive-form

この値は、名づけられた関数の、インタラクティブ形式です。通常、これを直接セットするべきではありません。かわりに、スペシャルフォームinteractiveを使用してください。Interactive Callを参照してください。

menu-enable

この値は、名づけられたメニューアイテムが、メニュー内で有効であるべきかを決定するための式です。Simple Menu Itemsを参照してください。

mode-class

値がspecialの場合、名づけられたメジャーモードは“special(特別)”です。Major Mode Conventionsを参照してください。

permanent-local

値が非nilの場合、名づけられた変数はバッファーローカル変数となり、変数の値はメジャーモードの変更によりリセットされません。Creating and Deleting Buffer-Local Bindingsを参照してください。

permanent-local-hook

値が非nilの場合、名づけられた変数はメジャーモードを変更したとき、フック変数のローカル値から削除されません。Setting Hooksを参照してください。

pure

値が非nilの場合、名づけられた関数は、副作用の影響を受けないとみなされます。定数の引数で呼び出された場合、コンパイル時に評価することができます。これは、実行時のエラーをコンパイル時へとシフトします。

risky-local-variable

値が非nilの場合、名づけられた変数は、ファイルローカル変数としては危険だとみなされます。File Local Variablesを参照してください。

safe-function

値が非nilの場合、名づけられた関数は、評価において一般的に安全だとみなされます。Determining whether a Function is Safe to Callを参照してください。

safe-local-eval-function

値が非nilの場合、名づけられた関数は、ファイルローカルの評価フォーム内で、安全に呼び出すことができます。File Local Variablesを参照してください。

safe-local-variable

値は、名付けられた変数の、安全なファイルローカル値を決定する関数を指定します。File Local Variablesを参照してください。

side-effect-free

nil値は、関数の安全性(Determining whether a Function is Safe to Callを参照してください)、およびバイトコンパイラーの最適化を決定するために、名づけられた関数が副作用から自由であることを示します。これをセットしないでください。

variable-documentation

nilの場合、それは名づけられた変数のドキュメント文字列を指定します。ドキュメント文字列は、defvarおよび関連する関数により、自動的にセットされます。Defining Facesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9 Evaluation

Emacs Lispでの式の評価(evaluation)は、Lispインタープリター — 入力としてLispオブジェクトを受け取り、それの式としての値(value as an expression)を計算します — により処理されます。評価を行なう方法は、そのオブジェクトのデータ型に依存し、それはこのチャプターで説明するルールにより行なわれます。インタープリターは、プログラムの一部を評価するために自動的に実行されますが、Lisp基本関数のevalを通じて、明示的に呼び出すこともできます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.1 Introduction to Evaluation

Lispインタープリター(またはLispエバリュエーター)は、Emacsの一部で、与えられた式の値を計算します。Lispで記述された関数が呼び出されるとき、エバリュエーターはその関数のbody(本文)の中の式を評価することにより、その関数の値を計算します。したがって、Lispプログラムを実行するとは、実際にはLispインタープリターを実行することを意味します。

評価されることを意図したLispオブジェクトは、フォーム(form)、または式(expression)と呼ばれます4。フォームはデータオブジェクトであり、単なるテキストではないというのは、Lisp風の言語と、通常のプログラミング言語との間にある、基本的な相違の1つです。任意のオブジェクトを評価できますが、実際に評価される事が非常に多いのは数字、シンボル、リスト、文字列です。

以降のセクションでは、各種フォームにたいして、それを評価することが何を意味するかの詳細を説明します。

Lispフォームを読み取り、それからそのフォームを評価するのは、非常に一般的なアクティビティーですが、読み取りと評価は別のアクティビティーであり、どちらか一方を単独で処理することができます。読み取りだけでは、何も評価されません。読み取りはLispオブジェクトのプリント表現を、そのオブジェクト自体に変換します。このオブジェクトは評価されるべきフォームなのか、そのれともまったく違う目的をもつかを指定するのは、readの呼び出し元の役目ですInput Functionsを参照してください。

評価とは再帰的な処理であり、あるフォームを評価することにより、そのフォームの一部が評価されるといったことがよくあります。たとえば、(car x)のような関数呼び出し(function call)のフォームを評価する場合、Emacsは最初にその引数(サブフォームx)を評価します。引数を評価した後、Emacsはその関数(car)を実行(executes)します。その関数がLispで記述されている場合は、関数のbody(本文)を評価することにより、実行が行なわれます(しかし、この例で使用しているcarはLisp関数ではなく、Cで実装された基本関数です)。関数と関数呼び出しについての情報は、Functionsを参照してください。

評価は、環境(environment)と呼ばれるコンテキストの内部で行なわれます。環境は、すべてのLisp変数(Variablesを参照してください)のカレント値とバインディングにより構成されます。5フォームが新たなバインディングを作成することなく、変数を参照するとき、その変数はカレントの環境により与えられる値に評価されます。フォームの評価は、変数のバインディングにより、一時的にその環境を変更することもあります(Local Variablesを参照してください)。

フォームの評価が、永続する変更を行なうこともあります。これらの変更は、副作用(side effects)と呼ばれます。副作用を生成するフォームの例は、(setq foo 1)です。

コマンドキー解釈にたいする評価と混同しないでください。エディターのコマンドループは、アクティブなキーマップを使用して、キーボード入力をコマンド(インタラクティブに呼び出すことができる関数)に変換してから、そのコマンドを実行するためにcall-interactivelyを使用します。そのコマンドはLispで記述されている場合、コマンドの実行は通常、評価を伴います。しかし、このステップはコマンドキー解釈の一部とは考えません。Command Loopを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2 Kinds of Forms

評価される事を意図したLispオブジェクトは、フォーム(form)または式(expression))と呼ばれます。Emacsがフォームを評価する方法は、フォームのデータ型に依存します。Emacsは、3種の異なるフォーム — シンボル、リスト、および“その他すべての型” — を持ち、それらは評価される方法は異なります。このセクションでは、まず最初は自己評価フォームの“その他すべての型”から開始して、3つの種類をすべて1つずつ説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.1 Self-Evaluating Forms

自己評価フォーム(self-evaluating form)は、リストやシンボルではない、任意のフォームです。自己評価フォームは、フォーム自身を評価します。評価の結果は、評価されたのと同じオブジェクトです。したがって、数字の25は25に評価され、文字列"foo"は文字列"foo"に評価されます。同様に、ベクターの評価では、ベクターの要素の評価は起こりません — 内容が変更されずに同じベクターがreturnされます。

'123               ; 評価されずに表示される数字。
     ⇒ 123
123                ; 通常どおり評価され、同じものがreturnされる。
     ⇒ 123
(eval '123)        ; “手動”による評価 — 同じものがreturnされる。
     ⇒ 123
(eval (eval '123)) ; 2度評価しても何も変わらない。
     ⇒ 123

事項評価されるという事実による利点から、数字、文字、文字列、そしてベクターでさえ、Lispコード内で記述されるのは一般的です。しかし、入力構文がない型にたいしてこれを行なうのは極めて異例です。なぜなら、これらをテキスト的に記述する方法がないからです。Lispプログラムを使用して、これらの型を含むLisp式を構築するのは、可能です。以下は例です:

;; バッファーオブジェクトを含む式を構築する。
(setq print-exp (list 'print (current-buffer)))
     ⇒ (print #<buffer eval.texi>)
;; それを評価する。
(eval print-exp)
     -| #<buffer eval.texi>
     ⇒ #<buffer eval.texi>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.2 Symbol Forms

シンボルが評価されるときは、変数として扱われます。それが値をもつ場合、結果はその変数の値になります。そのシンボルが変数としての値をもたない場合、Lispインタープリターはエラーをシグナルします。変数の使用法についての情報は、Variablesを参照してください。

以降の例では、setqでシンボルに値をセットしています。その後シンボルを評価してから、その値をsetqに戻します。

(setq a 123)
     ⇒ 123
(eval 'a)
     ⇒ 123
a
     ⇒ 123

シンボルniltは特別に扱われるので、nilの値は常にnilになり、tの値は常にtになります。これらに他の値をセットしたり、他の値にバインドすることはできません。したがって、この2つのシンボルは、(たとえevalがそれらを他の任意のシンボルと同じように扱うとはいえ)自己評価フォームと同じように振る舞います。名前が‘:’で始まるシンボルも、同じ方法で自己評価されます。そして、(通常は)値を変更できない点も同じです。Variables that Never Changeを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.3 Classification of List Forms

空ではないリストフォームは、関数呼び出し、マクロ呼び出し、スペシャルフォームのいずれかで、それは1番目の引数にしたがいます。これら3種のフォームは、以下で説明するように、異なる方法で評価されます。残りの要素は関数、マクロ、またはスペシャルフォームにたいする引数(arguments)を構成します。

空ではないリストを評価する最初のステップは、1番目の要素の確認です。この要素は単独で、そのリストがどの種類のフォームか、そして残りの引数をどのように処理するがを決定します。SchemeのようなLisp方言とは異なり、1番目の要素は評価されません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.4 Symbol Function Indirection

リストの最初の要素がシンボルの場合、評価はそのシンボルの関数セルを調べて、元のシンボルの代わりに、関数セルの内容を使用します。その内容が他のシンボルの場合、シンボルではないものが得られるまで、このプロセスが繰り返されます。このプロセスをシンボル関数インダイレクション(symbol function indirection: indirectionは間接の意)と呼びます。シンボル関数インダイレクションについての情報は、Naming a Functionを参照してください。

このプロセスの結果、シンボルの関数競るが同じシンボルを参照する場合、無限ループを起こす可能性があります。それ以外は、最終的には非シンボルにたどりつき、これは関数か、他の適切なオブジェクトであるはずです。

より正確に言うと、それはLisp関数(ラムダ式)、バイトコード関数、基本関数、Lispマクロ、スペシャルフォーム、またはオートロードオブジェクトであるべきです。これらの型のそれぞれについては、以降のセクションで説明します。これらの型以外のオブジェクトの場合、emacsはinvalid-functionエラーをシグナルします。

以下の例は、シンボルインダイレクションのプロセスを説明するものです。わたしたちは、シンボルの関数セルに関数をセットするのにfset、関数セルの内容(Accessing Function Cell Contentsを参照してください)を得るためにsymbol-functionを使用します。具体的に言うと、firstの関数セルにシンボルcarを格納し、シンボルfirstersteの関数セルに格納します。

;; この関数セルのリンクを構築する:
;;   -------------       -----        -------        -------
;;  | #<subr car> | <-- | car |  <-- | first |  <-- | erste |
;;   -------------       -----        -------        -------
(symbol-function 'car)
     ⇒ #<subr car>
(fset 'first 'car)
     ⇒ car
(fset 'erste 'first)
     ⇒ first
(erste '(1 2 3))   ; ersteにより参照される関数を呼び出す。
     ⇒ 1

対照的に、以下の例はシンボル関数インダイレクションを使用せずに関数を呼び出します。なぜなら、1番目の要素はシンボルではなく、無名Lisp関数(anonymous Lisp function)だからです。

((lambda (arg) (erste arg))
 '(1 2 3))
     ⇒ 1

関数自身を実行すると、その関数のbodyを評価します。これは、ersteを呼び出すとき、シンボル関数インダイレクションが行なわれます。

このフォームが使用されるのは稀で、今では推奨されません。かわりに以下のように記述するべきです:

(funcall (lambda (arg) (erste arg))
         '(1 2 3))

または単に

(let ((arg '(1 2 3))) (erste arg))

ビルトイン関数のindirect-functionは、明示的にシンボル関数インダイレクションを処理するための、簡単な方法を提供します。

Function: indirect-function function &optional noerror

この関数は、functionが意味するものを、関数としてreturnします。functionがシンボルの場合は、functionの関数定義を探して、その値で最初からやり直します。functionがシンボルでない場合は、function自身をreturnします。

この関数は、最後のシンボルがバインドされておらず、オプション引数noerrorが省略されているかnilの場合は、void-functionエラーをシグナルします。それ以外は、noerrorが非nilの場合は、最後のシンボルがバインドされていなければnilをreturnします。

特定のシンボル内にループがある場合、この関数はcyclic-function-indirectionエラーをシグナルします。

以下は、Lispでindirect-functionを定義できるという例です:

(defun indirect-function (function)
  (if (symbolp function)
      (indirect-function (symbol-function function))
    function))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.5 Evaluation of Function Forms

リストの1番目の要素がLispの関数オブジェクト。バイトコードオブジェクト、基本関数オブジェクトと評価された場合、そのリストは関数呼び出し(function call)になります。たとえば、以下は関数+を呼び出します:

(+ 1 x)

関数呼び出しを評価する最初のステップは、そのリストの残りの要素を左から右に評価します。結果は引数の実際の値で、リストの各要素にたいして1つの値となります。次のステップは、関数apply(Calling Functionsを参照してください)を使用して、引数のリストでその関数を呼び出します。関数がLispで記述されている場合、引数はその関数の引数変数にバインドするために使用されます。その後、関数body内のフォームが順番に評価され、listのbodyフォームの値は、関数呼び出しの値になります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.6 Lisp Macro Evaluation

リストの最初の要素がマクロオブジェクトと評価された場合、そのリストはマクロ呼び出し(macro call)になります。マクロ呼び出しが評価されるとき、リストの残りの要素は、最初は評価されません。そのかわり、これらの要素自体が、マクロの引数に使用されます。そのマクロ定義は、これは元のフォームの場所で評価される、置き換えのフォームを計算します。これは、マクロの展開(expansion)と呼ばれます。展開した結果は、任意の種類のフォーム — 自己評価定数、シンボル、リストになります。展開した結果自体がマクロ呼び出しの場合、結果が他の種類のフォームになるまで、繰り返し展開処理が行なわれます。

通常のマクロ展開は、その展開形を評価することにより終了します。しかし、他のプログラムもマクロ呼び出しを展開し、それらが展開形を評価するかもしれないし、評価しないかもしれないので、そのマクロ展開がすぐに、または最終的に評価される必要がない場合があります。

引き数式は通常、マクロ展開の計算の一部としては評価されませんが、展開の部分として現れるので、展開形が評価されるとき計算されます。

たとえば、以下のようなマクロ定義が与えられたとします:

(defmacro cadr (x)
  (list 'car (list 'cdr x)))

(cadr (assq 'handler list))のような式はマクロ呼び出しであり、展開形は以下のようになります:

(car (cdr (assq 'handler list)))

引数(assq 'handler list)が、展開形に含まれることに注意してください。

Emacs Lispマクロの完全な説明は、Macrosを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.7 Special Forms

スペシャルフォーム(special form)は特別だとマークされた基本関数で、その引数のすべては評価されません。もっともスペシャルなフォームは、制御構造の定義や、変数バインディングの処理など、関数ではできないことを行ないます。

スペシャルフォームはそれぞれ、どの引数が評価されて、どの引数が評価されないかについて、独自のルールをもちます。特定の引数が評価されるかどうかは、他の引数を評価した結果に依存します。

式の最初のシンボルがスペシャルフォームの場合、その式はそのスペシャルフォームのルールにしたがう必要があります。それ以外では、Emacsの挙動は(たとえクラッシュしなくても)定義されていません。たとえば((lambda (x) x . 3) 4)は、lambdaで始まるサブ式を含みますが、これは適正なlambda式ではないので、Emacsはエラーをシグナルするか、3、または4、またはnil、もしかしたら他の挙動を示すかもしれません。

Function: special-form-p object

この述語は、引数がスペシャルフォームかをテストし、スペシャルフォームならt、それ以外はnilをreturnします。

以下に、Emacs Lispのスペシャルフォームすべてと、それらがどこで説明されているかのリファレンスとともに、アルファベット順でリストします。

and

see section Constructs for Combining Conditions

catch

see section Explicit Nonlocal Exits: catch and throw

cond

see section Conditionals

condition-case

see section Writing Code to Handle Errors

defconst

see section Defining Global Variables

defvar

see section Defining Global Variables

function

see section Anonymous Functions

if

see section Conditionals

interactive

see section Interactive Call

lambda

see section Lambda Expressions

let
let*

see section Local Variables

or

see section Constructs for Combining Conditions

prog1
prog2
progn

see section Sequencing

quote

see section Quoting

save-current-buffer

see section The Current Buffer

save-excursion

see section Excursions

save-restriction

see section Narrowing

setq

see section Setting Variable Values

setq-default

see section Creating and Deleting Buffer-Local Bindings

track-mouse

see section Mouse Tracking

unwind-protect

see section Nonlocal Exits

while

see section Iteration

Common Lispに関する注意: ここで、GNU Emacsのスペシャルフォームと、Common Lispのスペシャルフォームを比較してみます。setqifcatchは、Emacs LispとCommon Lispの両方でスペシャルフォームです。save-excursionはEmacs Lispではスペシャルフォームですが、Common Lispには存在しません。throwはCommon Lispではスペシャルフォーム(なぜなら複数の値をthrowできなければならない)ですが、Emacs Lispでは(複数の値をもたない)関数です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.8 Autoloading

オートロード(autoload)機能により、関数定義がだEmacsにロードされていない関数(またはマクロ)を呼び出すことができます。オートロードは、定義がどのファイルに含まれるかを指定します。オートロードオブジェクトがシンボルの関数定義にある場合、関数としてそのシンボルを呼び出すことにより、自動的に指定されたファイルがロードされます。その後、ファイルからロードされた実際の定義を呼び出します。シンボル内の関数定義としてオートロードオブジェクトをアレンジする方法は、Autoloadで説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.3 Quoting

スペシャルフォームquoteは、単一の引数を、記述されたとおり、評価せずにreturnします。これはプログラムに、自己評価オブジェクトではない、定数シンボルや定数リストを含める方法を提供します(数字、文字列、ベクターのような自己評価オブジェクトをクォートする必要はありません)。

Special Form: quote object

このスペシャルフォームは、評価せずにobjectをreturnします。

プログラム中でquoteはよく使用されるので、Lispはそれにたいする便利な入力構文を提供します。アポストロフィー文字(‘'’)に続けてLispオブジェクト(の入力構文)を記述すると、それは1番目の要素がquoteで、2番目の要素がそのオブジェクトであるリストに展開されます。したがって、入力構文'xは、(quote x)の略記になります。

以下に、quoteを使用した式の例をいくつか示します:

(quote (+ 1 2))
     ⇒ (+ 1 2)
(quote foo)
     ⇒ foo
'foo
     ⇒ foo
''foo
     ⇒ (quote foo)
'(quote foo)
     ⇒ (quote foo)
['foo]
     ⇒ [(quote foo)]

他のクォート構成には、コンパイル用にLispで記述された無名のラムダ式の元になるfunction(Anonymous Functionsを参照してください)、および、リストを計算して置き換える際に、リストの一部だけをクォートするのに使用される‘`’(Backquoteを参照してください)があります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.4 Backquote

バッククォート構成(backquote constructs)を使用することにより、リストをクォートして、そのリストのある要素を選択的に評価することができます。もっとも簡単な使い方では、スペシャルフォームquoteと同じです (前のセクションで説明しています。Quotingを参照してください)。 たとえば、以下の2つのフォームは同じ結果を生みます:

`(a list of (+ 2 3) elements)
     ⇒ (a list of (+ 2 3) elements)
'(a list of (+ 2 3) elements)
     ⇒ (a list of (+ 2 3) elements)

バッククォートする引数の内側でスペシャルマーカー‘,’を使用すると、それは値が定数でないことを示します。Emacs Lispエバリュエーターは‘,’がついた引数を放火して、リスト構造内にその値を配します:

`(a list of ,(+ 2 3) elements)
     ⇒ (a list of 5 elements)

,’による置き換え、リスト構造のより深いレベルでも使用できます。たとえば:

`(1 2 (3 ,(+ 4 5)))
     ⇒ (1 2 (3 9))

スペシャルマーカー‘,@’を使用すれば、評価された値を結果リストに継ぎ足す(splice)こともできます。継ぎ足されたリストの要素は、結果リスト内の他の要素を同じレベルになります。‘`’を使用しない等価なコードは、しばしば読むのが困難です。以下にいくつかの例を示します:

(setq some-list '(2 3))
     ⇒ (2 3)
(cons 1 (append some-list '(4) some-list))
     ⇒ (1 2 3 4 2 3)
`(1 ,@some-list 4 ,@some-list)
     ⇒ (1 2 3 4 2 3)
(setq list '(hack foo bar))
     ⇒ (hack foo bar)
(cons 'use
  (cons 'the
    (cons 'words (append (cdr list) '(as elements)))))
     ⇒ (use the words foo bar as elements)
`(use the words ,@(cdr list) as elements)
     ⇒ (use the words foo bar as elements)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.5 Eval

ほとんどの場合、実行されるプログラム内に出現することにより、フォームは自動的に評価されます。稀に、実行時 — たとえば編集されているテキストや、プロパティーリストから取得したフォームを読み取った後 — に計算されるように、フォームを評価するコードを記述する必要があるかもしれません。このようなときは、eval関数を使用します。evalが不必要だったり、かわりに他の何かを使用すべきときが、しばしばあります。たとえば、変数から値を取得するには、evalも機能しますが、symbol-valueのほうが適しています。evalで評価するためにプロパティーリストに式を格納するより、かわりにfuncallに渡すように関数を格納した方がよいでしょう。

このセクションで説明する関数と変数は、フォームの評価、評価処理の制限の指定、最後にreturnされた値の記録を行なうものです。ファイルのロードでも評価が行なわれます(Loadingを参照してください)。

データ構造に式を格納してそれを評価するより、データ構造に関数を格納して、それをfuncallapplyで呼び出すほうが、より明解かつ柔軟です。関数を使用することにより、引数に情報を渡す能力が提供されます。

Function: eval form &optional lexical

これは、式を評価する、基本的な関数です。この関数は、カレント環境内でformを評価して、その結果をreturnします。formオブジェクトの型は、それが評価される方法を決定します。Kinds of Formsを参照してください。

引数lexicalは、ローカル変数にたいするスコープ規則(Scoping Rules for Variable Bindingsを参照してください)を指定します。これが省略されるかnilの場合、デフォルトのダイナミックスコープ規則を使用してformを評価することを意味します。tの場合は、レキシカルスコープ規則が使用されることを意味します。lexicalの値には、レキシカルバインディングにたいする特定のレキシカル環境(lexical environment)を指定する、空ではないalistも指定できます。しかし、この機能はEmacs Lispデバッガーのような、特別な目的にたいしてのみ有用です。Lexical Bindingを参照してください。

evalは関数なので、eval呼び出しに現れる引数式は2回 — 1度はevalが呼び出される前の準備、そしてeval関数自身によりもう1度 — 評価されます。以下は例です:

(setq foo 'bar)
     ⇒ bar
(setq bar 'baz)
     ⇒ baz
;; evalが引数fooを受け取る。
(eval 'foo)
     ⇒ bar
;; evalが、fooの値である、引数barを受け取る。
(eval foo)
     ⇒ baz

evalにより現在アクティブな呼び出しの数は、max-lisp-eval-depthに制限されます(以下参照)。

Command: eval-region start end &optional stream read-function

この関数は、カレントバッファー内の、位置startendで定義されるリージョン内のフォームを評価します。この関数はそのリージョンからフォームを読み取り、それらにたいしevalを呼び出します。これは、リージョンの最後に達するまで、または処理されないエラーがシグナルされるまで行なわれます。

デフォルトでは、eval-regionは何の出力も生成しません。しかし、streamが非nilの場合、出力関数(Output Functionsを参照してください)で生成された任意の出力、同様にリージョン内の式を評価した結果の値は、streamを使用してプリントされます。Output Streamsを参照してください。

read-functionが非nilの場合、readのかわりに1つずつ式を読み取るために使用する関数を指定します。これは、入力を読み取るストリームを指定する、1つの引数で呼び出される関数です。この関数を指定するために変数load-read-function(How Programs Do Loadingを参照してください)も使用できますが、引数read-functionを使用するほうが確実です。

eval-regionはポイントを移動しません。つねにnilをreturnします。

Command: eval-buffer &optional buffer-or-name stream filename unibyte print

この関数はeval-regionと似ていますが、引数は異なるオプション機能を提供します。eval-bufferは、バッファーbuffer-or-nameのアクセス可能な部分全体を処理します。buffer-or-nameにはバッファー名(文字列)を指定でき、nil(または省略)のときはカレントバッファーを意味します。streamnilかつprintが非nilでない場合、eval-regionのようにstreamが使用されます。この場合、式の評価による結果の値は依然として破棄されますが、出力関数による出力はエコーエリアにプリントされます。filenameは、load-history(Unloadingを参照してください)に使用されるファイル名で、デフォルトはbuffer-file-name(Buffer File Nameを参照してください)です。unibyteが非nilの場合、可能な限りreadは文字列をユニコードに変換します。

eval-current-bufferは、このコマンドのエイリアスです。

User Option: max-lisp-eval-depth

この変数は、エラー(エラーメッセージは"Lisp nesting exceeds max-lisp-eval-depth")がシグナルされる前に、evalapplyfuncallの呼び出しで許される最大の深さを定義します。

制限を超えたときのエラーをもつこの制限は、Emacs Lispで誤って定義された関数による無限再帰を避ける方法の1つです。max-lisp-eval-depthの値を過大に増加させた場合、そのようなコードはかわりにスタックオーバーフローを起こすでしょう。

たとえば、Lisp式に記述された関数の呼び出し、関数呼び出しの引数と、関数bodyフォームにたいする再帰評価、Lispコード内での明示的な呼び出しなどにたいして、深さ制限を数えるために、内部的にevalapplyfuncallを使用します。

この変数のデフォルト値は400です。この値を100未満にセットした場合、値が与えられた値に達すると、Lispはそれを100にリセットします。空きが少ない場合、デバッガー自身を実行するために空きが必要になるので、Lispデバッガーに入ったときは、この値が増加されます。

max-specpdl-sizeはネストの他の制限を提供します。Local Variablesを参照してください。

Variable: values

この変数の値は、読み取り、評価、プリントを行なった標準的なEmacsコマンドにより、バッファー(ミニバッファーを含む)からreturnされる値のリストです(これには*ielm*バッファーでの評価や、lisp-interaction-modeでのC-jを使用した評価は含まれないことに注意してください)。要素の順番は、もっとも最近のものが最初になります。

(setq x 1)
     ⇒ 1
(list 'A (1+ 2) auto-save-default)
     ⇒ (A 3 t)
values
     ⇒ ((A 3 t) 1 …)

この変数は、最近評価されたフォームの値を後で参照するのに便利です。values自体の値をプリントするのは、それがおそらく非常に長くなるので、通常は悪いアイデアです。かわりに、以下のように特定の要素を調べます:

;; もっとも最近評価された結果を参照する。
(nth 0 values)
     ⇒ (A 3 t)
;; これは新たな要素をputするので、
;;   すべての要素が1つ後に移動する。
(nth 1 values)
     ⇒ (A 3 t)
;; これは次に新しい、この例の前の次に新しい要素を取得する。
(nth 3 values)
     ⇒ 1

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10 Control Structures

Lispプログラムは、一連の式(expressions)、あるいはフォーム(forms)(Kinds of Formsを参照してください)により形成されます。これらのフォームの実行順は、それらを制御構造(control structures)で囲むことにより制御します。制御構造とは、その制御構造が含むフォームをいつ、どのような条件で、何回実行するかを制御する、スペシャルフォームです。

もっとも単純な実行順は、1番目はa、2番目はb、...という、シーケンシャル実行(sequential execution: 順番に実行)です。これは、関数のbody内の連続する複数のフォームや、Lispコードのファイル内のトップレベルを記述したときに発生します — つまり、フォームは記述した順に実行されます。わたしたちはこれをテキスト順(textual order)と呼びます。たとえば、関数のbodyが2つのフォームabから構成される場合、関数の評価は、最初にaを評価し、次にbを評価します。bを評価した結果が、その関数の値となります。

明示的に制御構造を使用することにより、シーケンシャルではない順番での実行が可能になります。

Emacs Lispは、他の様々な順序づけ、条件、繰り返し、(制御された)ジャンプを含む、複数の種類の制御構造を提供し、以下ではそれらすべてを記述します。ビルトインの制御構造は、制御構造のサブフォームが評価される必要がなかったり、順番に評価される必要がないので、スペシャルフォームです。独自の制御構造を構築するためにマクロを使用することができます(Macrosを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.1 Sequencing

フォームが出現する順番に評価するのは、あるフォームから別のフォームに制御を渡す、もっとも一般的な制御です。関数のbodyのような、あるコンテキストにおいては、自動的にこれが行なわれます。他の場所では、これを行なうために制御構造を使用しなければなりません。Lispで一単純な制御構造は、prognです。

スペシャルフォームprognは、以下のようなものです:

(progn a b c …)

これは、順番にabc、...を実行するよう指定します。これらはprognフォームのbodyと呼ばれます。body内の最後のフォームの値が、progn全体の値になります。(progn)nilをreturnします。

初期のLispでは、prognは、連続で複数のフォームを実行して最後のフォームの値を使用する、唯一の方法でした。しかしプログラマーは、関数のbodyの、(その時点では)1つのフォームだけが許される場所で、prognを使用する必要が多いことに気づきました。そのため、関数のbodyを“暗黙のprogn”にして、prognのbodyのように複数のフォームを記述出きるようにしました。他の多くの制御構造も、同様に暗黙のprognを含みます。結果として、昔ほどprognは多用されなくなりました。現在では、prognが必要になるのは、unwind-protectandorifthenパートの中がほとんどです。

Special Form: progn forms…

このスペシャルフォームは、formsのすべてをテキスト順に評価して、のフォームの結果をreturnします。

(progn (print "The first form")
       (print "The second form")
       (print "The third form"))
     -| "The first form"
     -| "The second form"
     -| "The third form"
⇒ "The third form"

他の2つの構成は、一連のフォームを同様に評価しますが、異なる値をreturnします:

Special Form: prog1 form1 forms…

このスペシャルフォームは、form1formsのすべてをテキスト順に評価して、form1の結果をreturnします。

(prog1 (print "The first form")
       (print "The second form")
       (print "The third form"))
     -| "The first form"
     -| "The second form"
     -| "The third form"
⇒ "The first form"

以下の例は、変数xのリストから1番目の要素を削除して、削除した1番目の要素の値をreturnします:

(prog1 (car x) (setq x (cdr x)))
Special Form: prog2 form1 form2 forms…

このスペシャルフォームは、form1form2、その後のformsのすべてをテキスト順で評価して、form2の結果をreturnします。

(prog2 (print "The first form")
       (print "The second form")
       (print "The third form"))
     -| "The first form"
     -| "The second form"
     -| "The third form"
⇒ "The second form"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.2 Conditionals

条件による制御構造は、候補の中から選択を行ないます。Emacs Lispは4つの条件フォームをもちます。ifは他の言語のものとほとんど同じです。whenunlessは、ifの変種です。condは一般化されたcase命令です。

Special Form: if condition then-form else-forms…

ifは、conditionの値にもとづいて、then-formelse-formsを選択します。評価されたconditionが非nilの場合は、then-formが評価されて、その結果がreturnされます。それ以外は、else-formsがテキスト順に評価されて、最後のフォームの値がreturnされます(ifelseパートは、暗黙のprognの例です。Sequencingを参照してください)。

conditionの値がnilで、else-formsが与えられない場合、ifnilをreturnします。

選択されなかったブランチは決して評価されない — 無視される — ので、ifはスペシャルフォームです。したがって、以下の例ではprintは呼び出されることはないので、trueはプリントされません。

(if nil
    (print 'true)
  'very-false)
⇒ very-false
Macro: when condition then-forms…

これは、else-formsがなく、複数のthen-formsがあるかもしれない、ifの変種です。特に、

(when condition a b c)

は以下と完全に等価です

(if condition (progn a b c) nil)
Macro: unless condition forms…

これはthen-formがない、ifの変種です:

(unless condition a b c)

は以下と完全に等価です

(if condition nil
   a b c)
Special Form: cond clause…

condは、任意の数の候補から選択を行ないます。cond内の各clauseは、リストでなければなりません。このリストのCARconditionで、(もしあれば)残りの要素はbody-formsです。したがって、条項は以下のようになります:

(condition body-forms…)

condは、各条項のconditionを評価することにより、テキスト順で条項を試験します。conditionの値が非nilの場合、その条項は“成り立ち”ます。その後、condは、その条項のbody-formsを評価して、body-formsの最後の値をreturnします。残りの条項は無視されます。

conditionの値がnilの場合、その条項は“成り立たず”、condは次の条項に移動して、その条項のconditionを試験します。

以下のようなものも、条項になります:

(condition)

conditionがテストされたときに非nilなら、condフォームはconditionの値をreturnします。

すべてのconditionnilに評価された場合 — つまりすべての条項が不成立の場合、condnilをreturnします。

以下の例は4つの条項をもち、xの値が数字か、文字列化、バッファーか、シンボルかをテストします:

(cond ((numberp x) x)
      ((stringp x) x)
      ((bufferp x)
       (setq temporary-hack x) ; 1つの条項に
       (buffer-name x))        ; 複数bodyフォーム。
      ((symbolp x) (symbol-value x)))

前の条項が不成立のとき、最後の条項を実行したいときがよくあります。これを行なうには、(t body-forms)のように、conditionの最後の条項にtを使用します。フォームttに評価され、決してnilにならないので、この条項が不成立になることはなく、最終的にcondはこの条項に到達します。たとえば:

(setq a 5)
(cond ((eq a 'hack) 'foo)
      (t "default"))
⇒ "default"

このcond式は、aの値がhackの場合はfoo、それ以外は文字列"default"をreturnします。

任意の条件構成は、condifで表すことができます。したがって、どちらを選択するかは、スタイルの問題です、たとえば:

(if a b c)
≡
(cond (a b) (t c))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.2.1 Pattern matching case statement

特定の値を、可能なさまざまの場合にたいして比較するには、マクロpcaseが便利です。これは以下のフォームをとります:

(pcase exp branch1 branch2 branch3 …)

branchは、(upattern body-forms…)というフォームです。

これは最初にexpを評価してから、どのbranchを使用するか、その値を各upatternと比較して、その後で対応するbody-forms実行します。一般的なのは、少数の異なる定数値を区別するために使用される場合です:

(pcase (get-return-code x)
  (`success       (message "Done!"))
  (`would-block   (message "Sorry, can't do it now"))
  (`read-only     (message "The shmliblick is read-only"))
  (`access-denied (message "You do not have the needed rights"))
  (code           (message "Unknown return code %S" code)))

最後の条項のcodeは、(get-return-code x)からreturnされた値にバインドされる変数です。

もっと複雑な例として、以下のような小さな式言語のための単純なインタープリターを示します(この例ではレキシカルバインディングが必要なことに注意してください):

(defun evaluate (exp env)
  (pcase exp
    (`(add ,x ,y)       (+ (evaluate x env) (evaluate y env)))
    (`(call ,fun ,arg)  (funcall (evaluate fun env) (evaluate arg env)))
    (`(fn ,arg ,body)   (lambda (val)
                          (evaluate body (cons (cons arg val) env))))
    ((pred numberp)     exp)
    ((pred symbolp)     (cdr (assq exp env)))
    (_                  (error "Unknown expression %S" exp))))

`(add ,x ,y)は、expがシンボルaddで始まる3要素のリストかチェックして、その後2番目と3番目の要素を抽出し、それらを変数xyにバインドするパターンです。(pred numberp)expが数字かを単にチェックし、_はすべてのものにマッチするcatch-allパターンです。

以下に、いくつかの例を評価した結果とともに示します:

(evaluate '(add 1 2) nil)                 ;=> 3
(evaluate '(add x y) '((x . 1) (y . 2)))  ;=> 3
(evaluate '(call (fn x (add 1 x)) 2) nil) ;=> 3
(evaluate '(sub 1 2) nil)                 ;=> error

pcaseに関係する2種類のパターンがあり、それらはU-patternsQ-patternsと呼ばれます。上述のupatternはU-patternsで、以下の形式をもつことができます:

`qpattern

これは、もっとも一般的なパターンの1つです。このパターンの意図は、バッククォートマクロの模倣です。このパターンは、バッククォート式により構築されるような値にマッチします。わたしたちが行なうのは値の構築ではなくパターンマッチングなので、非クォートは式をどこに挿入するか示すのではなく、かわりにその位置で値にマッチすべき1つのU-patternを指定します。

より具体的には、Q-patternは以下のフォームをもつことができます:

(qpattern1 . qpattern2)

このパターンは、carqpattern1cdrpattern2にマッチする、任意のコンスセルにマッチします。

atom

このパターンは、atomequalな任意のアトムにマッチします。

,upattern

このパターンは、upatternにマッチする任意のオブジェクトにマッチします。

symbol

U-pattern内の単なるシンボルはすべてにマッチし、さらにマッチした値にそのシンボルをバインドするので、body-formsや皇族のパターンから、それを参照することができます。

_

このパターン — いわゆるdon’t careパターン — はシンボルパターンと同様、すべてのものにマッチしますが、シンボルパターンとは異なり、変数へのバインドを行ないません。

(pred pred)

このパターンは、マッチされるオブジェクトで関数predが呼び出したとき、非nilをreturnするものにマッチします。

(or upattern1 upattern2…)

このパターンは、引数のパターンから最初に成立したパターンにマッチします。すべての引数パターンは、同じ変数にバインドされるべきです。

(and upattern1 upattern2…)

このパターンは、すべての引数パターンが成立したときだけマッチします。

(guard exp)

このパターンは調べられるオブジェクトを無視して、expが非nilに評価されたときは成立、それ以外は不成立となります。これは通常、andパターンの内部で使用されます。たとえば、(and x (guard (< x 10)))は10より小さい任意の数字にマッチして、それを変数xにバインドします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.3 Constructs for Combining Conditions

このセクションは、複雑な条件を表現するために、ifcondとともによく使用される3つの構成を記述します。andorの構成は、ある種の複数条件の構成として、個別に使用することもできます。

Function: not condition

この関数は、conditionが偽であることをテストします。この関数はconditionnilの場合はt、それ以外はnilをreturnします。関数notnullと等価で、わたしたちは空のリストをテストする場合は、nullの使用を推奨します。

Special Form: and conditions…

スペシャルフォームandは、すべてのconditionsが真かどうかをテストします。この関数は、conditionsを記述された順に1つずつ評価することにより機能します。

あるconditionsnilに評価された場合、残りのconditionsに関係なく、andnilをreturnしなければなりません。この場合、andは即座にnilをreturnし、残りのconditionsは無視されます。

すべてのconditionsが非nilの場合、それらの最後の値がandフォームの値になります。conditionsのない単独の(and)は、tをreturnします。なぜなら、すべてのconditionsが非nilとなるので(考えてみてください。そうでないのはどれですか?)、これは適切です。

以下に例を示します。1番目の条件は整数1をretuenし、これはnilではありません。同様に2番目の条件は整数2をreturnし、これもnilではありません。3番目の条件はnilなので、のこりの条件が評価されることは決してありません。

(and (print 1) (print 2) nil (print 3))
     -| 1
     -| 2
⇒ nil

以下は、andを使用した、より現実的な例です:

(if (and (consp foo) (eq (car foo) 'x))
    (message "foo is a list starting with x"))

(consp foo)nilをreturnした場合、(car foo)は実行されないので、エラーにならないことに注意してください。

ifcondのどちらかを使用して、and式を記述することもできます。以下はその方法です:

(and arg1 arg2 arg3)
≡
(if arg1 (if arg2 arg3))
≡
(cond (arg1 (cond (arg2 arg3))))
Special Form: or conditions…

スペシャルフォームorは、少なくとも1つのconditionsが真かどうかをテストします。この関数は、すべてのconditionsを1つずつ、記述された順に評価することにより機能します。

あるconditionsが非nil値に評価された場合、orの結果は非nilでなければなりません。この場合、orは即座にreturnし、残りのconditionsは無視されます。この関数がreturnする値は、非nil値に評価された条件の値そのものです。

すべてのconditionsnilになった場合、or式はnilをreturnします。conditionsのない単独の(or)は、nilをreturnします。なぜなら、すべてのconditionsnilになるので(考えてみてください。そうでないのはどれですか?)、これは適切です。

たとえば、この式はxnilまたは整数0かどうかをテストします:

(or (eq x nil) (eq x 0))

and構成と同様に、orcondに置き換えて記述することができます。たとえば:

(or arg1 arg2 arg3)
≡
(cond (arg1)
      (arg2)
      (arg3))

ほとんどの場合、orifに置き換えて記述できますが、完全ではありません:

(if arg1 arg1
  (if arg2 arg2
    arg3))

これは完全に同一ではありません。なぜならarg1またはarg2を2回評価するかもしれないからです。対照的に、(or arg1 arg2 arg3)は2回以上引数を評価することは、決してありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.4 Iteration

繰り返し(iteration)とは、プログラムの一部を繰り返し実行することを意味します。たとえば、リストの各要素、または0からnの整数にたいして、1度ずつ繰り返し何らかの計算をおこないたいとしましょうEmacs Lispでは、スペシャルフォームwhileでこれを行なうことができます:

Special Form: while condition forms…

whileは、最初にconditionを評価します。結果が非nilの場合は、formsをテキスト順に評価します。その後conditionを再評価して、結果が非nilの場合、再度formsを評価します。この処理は、conditionnilに評価されるまで繰り返されます。

繰り返し回数に制限はありません。このループは、conditionnilに評価されるか、エラーとなるか、throwで抜け出す(Nonlocal Exitsを参照してください)まで計測されるでしょう

whileフォームの値は、常にnilです。

(setq num 0)
     ⇒ 0
(while (< num 4)
  (princ (format "Iteration %d." num))
  (setq num (1+ num)))
     -| Iteration 0.
     -| Iteration 1.
     -| Iteration 2.
     -| Iteration 3.
     ⇒ nil

各繰り返しごとに何かを実行して、その後も終了テストを行なう“repeat...until”ループを記述するには、以下のようにwhileの1番目の引数として、bodyの後に終了テストを記述して、それをprognの中に配します:

(while (progn
         (forward-line 1)
         (not (looking-at "^$"))))

これは1行前方に移動して、空行に達するまで行単位の移動を継続します。独特なのは、whileがbodyをもたず、終了テスト(これはポイント移動の実処理も行ないます)だけという点です。

マクロdolistおよびdotimesは、2つの一般的な種類のループを記述する、便利な方法を提供します。

Macro: dolist (var list [result]) body…

この構成は、listの各要素にたいして1度bodyを実行し、カレント要素をローカルに保持するように、変数varにバインドします。その後、resultを評価した値、またはresultが省略された場合はnilをreturnします。たとえば、以下はreverse関数を定義するために、dolistを使用する方法の例です:

(defun reverse (list)
  (let (value)
    (dolist (elt list value)
      (setq value (cons elt value)))))
Macro: dotimes (var count [result]) body…

この構成は、0以上count未満の各整数にたいして1度bodyを実行し、その繰り返しでの整数を、変数varにバインドします。その後、resultの値、またはresultが省略された場合はnilをreturnします。以下は、dotimesを使用して、何らかの処理を100回行なう例です:

(dotimes (i 100)
  (insert "I will not obey absurd orders\n"))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5 Nonlocal Exits

非ローカル脱出(nonlocal exit)とは、プログラム内のある位置から、別の離れた位置へ、制御を移します。Emacs Lispでは、エラーの結果として非ローカル脱出が発生することがあります。明示的な制御の下で非ローカル脱出を使用することもできます。非ローカル脱出は、脱出しようとしている構成により作成された、すべての変数バインディングのバインドを外します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.1 Explicit Nonlocal Exits: catch and throw

ほとんどの制御構造は、そのコンストラクト自身内部の制御フローだけに影響します。関数throwは、通常のプログラム実行でのこのルールの例外です。これは、リクエストにより非ローカル脱出を行ないます(他にも例外はありますが、それらはエラー処理だけのものです)。throwcatchの内部で試用され、catchに制御を戻します。たとえば:

(defun foo-outer ()
  (catch 'foo
    (foo-inner)))

(defun foo-inner ()
  …
  (if x
      (throw 'foo t))
  …)

throwフォームが実行された場合は、対応するcatchに制御を移し、catchは即座にreturnします。throwの後のコードは実行されません。throwの2番目の引数は、catchのreturn値として使用されます。

関数throwは、1番目の引数にもとづいて、それにマッチするcatchを探します。throwは、1番目の引数が、throwで指定されたものとeqcatchを検索します。複数の該当するcatchがある場合、最内のものが優先されます。したがって、上記の例ではthrowfooを指定し、foo-outer内のcatchが同じシンボルを指定しているので、(この間に他のマッチするcatchは存在しないと仮定すると)catchが該当します。

throwの実行により、マッチするcatchまでのすべてのリスプ構成(関数呼び出しを含む)を脱出します。この方法によりletや関数呼び出しのようなバインディング構成を脱出する場合、これらの構成を正常にexitしたときのように、そのバインディングは解かれます(Local Variablesを参照してください)。同様にthrowは、save-excursion(Excursionsを参照してください)により保存されたバッファーと位置を復元します。throwが、スペシャルフォームunwind-protectを脱出した場合、unwind-protectにより設定されたいくつかのクリーンアップも実行します。

ジャンプ先となるcatch内にレキシカル(局所的)である必要はありません。throwは、catch内で呼び出された別の関数から、同じようにに呼び出すことができます。throwが行なわれたのが、順序的に、catchに入った後でexitする前である限り、そのthrowcatchにアクセスできます。エディターのコマンドループから戻るexit-recursive-editのようなコマンドで、throwが使用されるのは、これが理由です。

Common Lispに関する注意: Common Lispを含む、他のほとんどのバージョンのLispは、非シーケンシャルに制御を移す、いくつかの方法 — たとえばreturnreturn-fromgo — をもちます。Emacs Lispの場合は、throwだけです。cl-libライブラリーは、これらのうちいくつかを提供します。Blocks and Exits in Common Lisp Extensionsを参照してください。

Special Form: catch tag body…

catchは、throw関数にたいするreturn位置を確立します。return位置はtagにより、そのような他のreturn位置と区別されます。tagは、nil以外の任意のLispオブジェクトです。引数tagはreturn位置が確立される前に、通常どおり評価されます。

return位置が効果をもつことにより、catchbodyのフォームをテキスト順に評価します。フォームが(エラーは非ローカル脱出なしで)通常に実行された場合、bodyの最後のフォームの値が、catchからreturnされます。

bodyの実効の間にthrowが実行された場合、tagと同じ値を指定すると、catchフォームは即座にexitします。returnされる値は、それが何であれ、throwの2番目の引数に指定された値です。

Function: throw tag value

throwの目的は、以前にcatchにより確立されたreturn位置に戻ることです。引数tagは、既存のさまざまなreturn位置からrturn位置を選択するために使用されます。複数のreturn位置がtagにマッチする場合、最内のものが使用されます。

引数valueは、catchからreturnされる値として使用されます。

タグtagのreturn位置が存在しない場合、データ(tag value)とともに、no-catchエラーがシグナルされます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.2 Examples of catch and throw

2重にネストされたループから脱出する1つの方法は、catchthrowを使うことです(ほとんどの言語では、これは“goto”により行なわれるでしょう)。ここでは、ijを、0から9に変化させて(foo i j)を計算します:

(defun search-foo ()
  (catch 'loop
    (let ((i 0))
      (while (< i 10)
        (let ((j 0))
          (while (< j 10)
            (if (foo i j)
                (throw 'loop (list i j)))
            (setq j (1+ j))))
        (setq i (1+ i))))))

fooが非nilをreturnした場合、即座に処理を止めて、ijのリストをreturnしています。fooが常にnilをreturnする場合、catchは通常どおりreturnし、その値はwhileの結果であるnilとなります。

以下では、2つのreturn位置を1度に表す、微妙に異なるトリッキーな例を2つ示します。最初に、同じタグhackにたいする2つのreturn位置があります:

(defun catch2 (tag)
  (catch tag
    (throw 'hack 'yes)))
⇒ catch2
(catch 'hack
  (print (catch2 'hack))
  'no)
-| yes
⇒ no

どちらのreturn位置もthrowにマッチするタグをもつので、内側のもの、つまりcatch2で確立されたものにgotoします。したがってcatch2は通常どおり値yesをreturnするので、その値がプリントされます。最後に外側のcatchの2番目のbody、つまり'noが評価されて、外側のcatchからそれがreturnされます。

ここで、catch2に与える引数を変更してみます:

(catch 'hack
  (print (catch2 'quux))
  'no)
⇒ yes

この場合も2つのreturn位置がありますが、今回は外側だけがタグhackをもち、内側のものは、かわりにタグquuxをもちます。したがって、throwにより、外側のcatchが値yesをreturnします。関数printが呼び出されることはなく、bodyのフォーム'noも決して評価されません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3 Errors

Emacs Lispが、何らかの理由により評価できないようなフォームの評価を試みた場合には、エラー(error)シグナル(signal)されます。

エラーがシグナルされた場合、エラーメッセージの表示とカレントこまんどの実行の終了が、Emacsデフォルトの反応です。たとえばバッファーの最後でC-fとタイプしたときのように、ほとんどの場合、これは正しい反応です。

複雑なプログラムでは、単なる終了が望ましくない場合もあるでしょう。たとえば、そのプログラムはデータ構造に一時的に変更を行なっていたり、プログラム終了前に削除すべき一時バッファーを作成しているかもしれません。このような場合、エラー時に評価されるクリーンアップ式(cleanup expressions)を設定するために、unwind-protectを使用するでしょう(Cleaning Up from Nonlocal Exitsを参照してください)。サブルーチン内のエラーにもかかわらずに、プログラムの実行を継続したいときがあるかもしれません。この場合、エラー時のリカバリーを制御するためのエラーハンドラー(error handlers)を設定するために、condition-caseを使用するでしょう。

エラーハンドリングを使用せずに、プログラムの一部から別の部分へ制御を移すためには、catchthrowを使用します。Explicit Nonlocal Exits: catch and throwを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3.1 How to Signal an Error

エラーのシグナリング(signaling)とは、エラーの処理を開始することを意味します。エラー処理は通常、実行中のプログラムのすべて、または一部をアボート(abort)して、エラーをハンドルするためにセットアップされた位置にreturnします。ここでは、エラーをシグナルする方法を記述します。

ほとんどのエラーは、たとえば、整数にたいしてCARを求めたり、バッファーの最後で1文字前方に移動したときなどのように、他の目的のために呼び出したLisp基本関数の中で、“自動的”にシグナルされます。関数errorsignalで、明示的にエラーをシグナルすることもできます。

ユーザーがC-gをタイプしたときに発生するquitは、エラーとは判断されませんが、ほとんどはエラーと同様に扱われます。Quittingを参照してください。

すべてのエラーメッセージはそれぞれ、何らかのエラーメッセージを指定します。そのメッセージは、何が悪いのか(“File does not exist”)、物事がどうしてそうあるべきではない(“File must exist”)かを示すべきです。Emacs Lispの監修では、エラーメッセージは大文字で開始され、句読点で終わるべきではありません。

Function: error format-string &rest args

この関数は、format-stringargsにたいして、format(Formatting Stringsを参照してください)を適用することにより構築されたエラーメッセージとともに、エラーをシグナルします。

以下は、errorを使用する典型的な例です:

(error "That is an error -- try something else")
     error→ That is an error -- try something else
(error "You have committed %d errors" 10)
     error→ You have committed 10 errors

2つの引数 — エラーシンボルerrorと、formatによりreturnされる文字列を含むリスト — でsignalを呼び出すことにより、errorは機能します。

警告: エラーメッセージとして固定の文字列を使用したい場合、単に(error string)とは記述しないでください。もしstringが‘%’を含む場合、それはフォーマット指定子(format specifier)として解釈されてしまうので、望む結果は得られません。かわりに、(error "%s" string)を使用してください。

Function: signal error-symbol data

この関数は、error-symbolにより命名されるエラーをシグナルします。引数dataは、エラーの状況に関連する追加のLispオブジェクトのリストです。

引数error-symbolは、エラーシンボル(error symbol)define-errorにより定義されYたシンボル — でなければなりません。これはEmacs Lispが異なる種類のエラーをクラス分けする方法です。エラーシンボル(error symbol)、エラーコンディション(error condition)、コンディション名(condition name)の説明については、Error Symbols and Condition Namesを参照してください。

エラーが処理されない場合、エラーメッセージをプリントするために2つの引数が使用されます。このエラーメッセージは通常、error-symbolerror-messageプロパティーにより提供されます。dataが非nilの場合、その後にコロンと、dataの評価されていない要素を、カンマで区切ったリストが続きます。errorが発生した場合、エラーメッセージは、dataCAR(文字列でなければなりません)です。file-errorのサブカテゴリーは、特別に処理されます。

data内のオブジェクトの数と重要性は、error-symbolに依存します。たとえば、wrong-type-argumentエラーでは、リスト内には2つのオブジェクト — 期待する型を記述する述語と、その型への適合に失敗したオブジェクト — であるべきです。

エラーを処理する任意のエラーハンドラーにたいして、error-symboldataの両方を利用できます。condition-caseは、ローカル変数を(error-symbol . data)というフォームでバインドします(Writing Code to Handle Errorsを参照してください)。

関数signalは、決してreturnしません。

(signal 'wrong-number-of-arguments '(x y))
     error→ Wrong number of arguments: x, y
(signal 'no-such-error '("My unknown error condition"))
     error→ peculiar error: "My unknown error condition"
Function: user-error format-string &rest args

この関数は、errorとまったく同じように振る舞いますが、errorではなく、user-errorというエラーシンボルを使用します。名前が示唆するように、このエラーはコード自身のエラーではなく、ユーザーパートのエラーの報告を意図しています。たとえば、Infoの閲覧履歴の開始を超えて履歴を遡るためにコマンドInfo-history-back (l)を使用した場合、Emacsはuser-errorをシグナルします。このようなエラーでは、たとえdebug-on-errorが非nilであっても、デバッガーへのエントリーは発生しません。Entering the Debugger on an Errorを参照してください。

Common Lispに関する注意: Emacs Lispには、Common Lispのような継続可能なエラーのような概念は存在しません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3.2 How Emacs Processes Errors

エラーがシグナルされたとき、signalは、そのエラーにたいするアクティブなハンドラー(handler)を検索します。ハンドラーとは、Lispプログラムの一部でエラーが発生したときに実行するよう意図された、Lisp式のシーケンスです。そのエラーが適切なハンドラーをもつ場合、そのハンドラーが実行され、そのハンドラーの後から実行が再開されます。ハンドラーは、そのハンドラーが設定されたcondition-caseの環境内で実行されます。condition-case内のすべての関数呼び出しはすでに終了しているので、ハンドラーがそれらにreturnすることはありません。

そのエラーにたいする適切なハンドラーが存在しない場合は、カレントコマンドを終了して、エディターのコマンドループに制御をreturnします(コマンドループは、すべての種類のエラーにたいする暗黙のハンドラーをもちます)。コマンドループのハンドラーは、エラーメッセージをプリントするために、エラーシンボルと、関連付けられたデータを使用します。変数command-error-functionを使用して、これが行なわれる方法を制御できます:

Variable: command-error-function

この変数は、もし非nilの場合はEmacsのコマンドループに制御をreturnしたエラーの処理に使用する関数を指定します。この関数は3つの引数をとります。1つ目はdataで、condition-caseが自身の変数にバインドするのと同じフォームです。2つ目はcontextで、これはエラーが発生した状況を記述する文字列、またはnil(よくある)です。3つ目はcallerで、これはエラーをシグナルした基本関数を呼び出したLisp関数です。

明示的なハンドラーのないエラーは、Lispデバッガーを呼び出すかもしれません。変数debug-on-error (Entering the Debugger on an Errorを参照してください)が非nilの場合、デバッガーが有効です。エラーハンドラーとは異なり、デバッガーはそのエラーの環境内で実行されるので、エラー時の変数の値を正確に調べることができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3.3 Writing Code to Handle Errors

エラーをシグナルすることによる通常の効果は、実行されていたコマンドを終了して、Emacsエディターのコマンドループに即座にreturnすることです。スペシャルフォームcondition-caseを使用して、エラーハンドラーを設定することにより、プログラム内の一部で発生するエラーのをトラップを調整することができます。以下は単純な例です:

(condition-case nil
    (delete-file filename)
  (error nil))

これは、filenameという名前のファイルを削除して、任意のエラーをcatchして、エラーが発生した場合はnilを参照してください(このような単純なケースでは、マクロignore-errorsを使用することもできます。以下を参照してください)。

condition-case構成は、insert-file-contents呼び出しでのファイルオープンの失敗のような、予想できるエラーをトラップするために多用されます。condition-case構成は、ユーザーからの読み取った式を評価するプログラムのような、完全に予測できないエラーのトラップにも使用されます。

condition-caseの2番目の引数は、保護されたフォーム(protected form)と呼ばれます(上記の例では、保護されたフォームは、delete-fileの呼び出しです)。このフォームの実行が開始されると、エラーハンドラーは効果をもち、このフォームがreturnすると不活性になります。その間のすべてにおいて、エラーハンドラーは効果をもちます。特に、このフォームで呼び出された関数、およびそのサブルーチンなどを実行する間、エラーハンドラーは効果をもちます。厳密にいうと、保護されたフォーム自身ではなく、保護されたフォームにより呼び出されたLisp基本関数(signalerrorを含む)だけがシグナルされるというのは、よいことです。

保護されたフォームの後の引数はハンドラーです。各ハンドラーは、どのエラーを処理するかを指定する、1つ以上のコンディション名(condition names)(シンボル)をリストします。エラーがシグナルされたとき、エラーシンボルはコンディション名のリストも定義します。エラーが共通の条件名をもつ場合、そのハンドラーはそのエラーに適用されます。上記の例では、1つのハンドラーがあり、それはすべてのエラーをカバーする条件名errorを指定しています。

適切なハンドラーの検索は、もっとも最近に設定されたハンドラーから開始して、設定されたすべてのハンドラーをチェックします。したがって、ネストされたcondition-caseフォームに同じエラー処理がある場合、内側のハンドラーがそれを処理します。

何らかのcondition-caseによりエラーが処理された場合、debug-on-errorでエラーによりデバッガーが呼び出されるようにしていても、通常はデバッガーの実行が抑制されます。

condition-caseにより補足されるようなエラーをデバッグできるようにしたい場合は、変数debug-on-signalに非nil値をセットします。以下のようにコンディションの中にdebugを記述することにより、最初にデバッガーを実行するような、特定のハンドラーを指定することもできます:

(condition-case nil
    (delete-file filename)
  ((debug error) nil))

ここでのdebugの効果は、デバッガー呼び出しを抑制するcondition-caseを防ぐことだけです。debug-on-errorおよびその他のフィルタリングメカニズムがデバッガーを呼び出すように指定されているときだけ、エラーによりデバッガーが呼び出されます。Entering the Debugger on an Errorを参照してください。

Macro: condition-case-unless-debug var protected-form handlers…

マクロcondition-case-unless-debugは、そのようなフォームのデバッギングを処理する、別の方法を提供します。このマクロは、変数debug-on-errornilの場合、つまり任意のエラーを処理しないようなケース以外は、condition-caseとまったく同様に振る舞います。

特定のハンドラーがそのエラーを処理するとEmacsが判断すると、Emacsは制御をそのハンドラーにreturnします。これを行うために、Emacsはそのとき脱出しつつあるバインディング構成により作成されたすべての変数のバインドを解き、そのとき脱出しつつあるすべてのunwind-protectフォームを実行します。制御がそのハンドラーに達すると、そのハンドラーのbodyが通常どおり実行されます。

そのハンドラーのbodyを実行した後、condition-caseフォームから実行がreturnされます。保護されたフォームは、そのハンドラーの実行の前に完全にexitしているので、そのハンドラーはそのエラーの位置から実行を再開することはできず、その保護されたフォーム内で作られた変数のバインディングを調べることもできません。ハンドラーが行なえることは、クリーンアップと、処理を進行させることだけです。

エラーのシグナルとハンドルには、throwcatch(Explicit Nonlocal Exits: catch and throw)に類似する点がいくつかありますが、これらは完全に別の機能です。エラーはcatchでキャッチできず、throwをエラーハンドラーで処理することはできません(しかし対応するcatchが存在しないときにthrowを仕様することによりシグナルされるエラーは、処理できます)。

Special Form: condition-case var protected-form handlers…

このスペシャルフォームは、protected-formの実行を囲い込むエラーハンドラーhandlersを確立します。エラーなしでprotected-formが実行された場合、returnされる値はcondition-caseフォームの値になります。この場合、condition-caseは効果をもちません。protected-formの間にエラーが発生した場合、condition-caseは違いをもちます。

それぞれのhandlersは、(conditions body…)というフォームのリストです。ここでconditionsは、ハンドルされるエラーコンディション名、またはそのハンドラーの前にデバッガーを実行するためのコンディション名(debugを含みます)です。bodyは、このハンドラーがエラーを処理するときに実行される、1つ以上のLisp式です。

(error nil)

(arith-error (message "Division by zero"))

((arith-error file-error)
 (message
  "Either division by zero or failure to open a file"))

発生するエラーはそれぞれ、それが何の種類のエラーかを記述するエラーシンボル(error symbol)をもち、これはコンディション名のリストも記述します(Error Symbols and Condition Namesを参照してください)。Emacsは、1つ以上のコンディション名を指定するハンドラーにたいして、すべてのアクティブなcondition-caseフォームを検索します。condition-caseの最内のマッチは、そのエラーを処理します。このcondition-caseでは、最初に適合したハンドラーが、そのエラーを処理します。

ハンドラーのbodyを実行した後、condition-caseは通常どおりreturnし、ハンドラーのbodyの最後の値を、ハンドラー全体の値として使用します。

引数varは変数です。protected-formを実行するとき、condition-caseはこの変数をバインドせず、エラーを処理するときだけバインドします。その場合は、varエラー記述(error description)にバインドします。これはエラーの詳細を与えるリストです。このエラー記述は、(error-symbol . data)というフォームをもちます。ハンドラーは、何を行なうか決定するために、このリストを参照することができます。たとえば、ファイルオープンの失敗にたいするエラーの場合、ファイル名がdata(エラー記述の3番目の要素)の2番目の要素になります。

varnilの場合、それはバインドされた変数がないことを意味します。この場合、エラーシンボルおよび関連するデータは、そのハンドラーでは利用できません。

より外側のレベルのハンドラーにcatchさせるために、condition-caseによりcatchされたシグナルを再度throwする必要がある場合もあります。以下はこれを行なう方法です:

  (signal (car err) (cdr err))

ここでerrはエラー記述変数(error description variable)で、condition-caseの1番目の引数は、再throwしたいエラーコンディションです。Definition of signalを参照してください。

Function: error-message-string error-descriptor

この関数は、与えられたエラー記述子(error descriptor)にたいするエラーメッセージ文字列をreturnします。これは、そのエラーにたいする通常のエラーメッセージをプリントすることにより、エラーを処理したい場合に有用です。Definition of signalを参照してください。

以下は、0除算の結果によるエラーを処理するために、condition-caseを使用する例です。このハンドラーは、(beepなしで)エラーメッセージを表示して、非常に大きい数をreturnします。

(defun safe-divide (dividend divisor)
  (condition-case err
      ;; 保護されたフォーム。
      (/ dividend divisor)
    ;; ハンドラー。
    (arith-error                        ; Condition.
     ;; このエラーにたいする、通常のメッセージを表示する。
     (message "%s" (error-message-string err))
     1000000)))
⇒ safe-divide
(safe-divide 5 0)
     -| Arithmetic error: (arith-error)
⇒ 1000000

このハンドラーはコンディション名arith-errorを指定するので、division-by-zero(0除算)エラーだけを処理します。他の種類のエラーは(このcondition-caseによっては)、処理されません。したがって:

(safe-divide nil 3)
     error→ Wrong type argument: number-or-marker-p, nil

以下は、errorによるエラーを含む、すべての種類のエラーをcatchするcondition-caseです:

(setq baz 34)
     ⇒ 34
(condition-case err
    (if (eq baz 35)
        t
      ;; 関数errorの呼び出し
      (error "Rats!  The variable %s was %s, not 35" 'baz baz))
  ;; フォームではないハンドラー。
  (error (princ (format "The error was: %s" err))
         2))
-| The error was: (error "Rats!  The variable baz was 34, not 35")
⇒ 2
Macro: ignore-errors body…

これは、その実行中に発生する任意のエラーを無視して、bodyの実行を構築します。その実行にエラーがなかった場合、ignore-errorsbody内の最後のフォームの値をreturnし、それ以外はnilをreturnします。

以下は、このセクションの最初の例を、ignore-errorsを使用して記述する例です:

  (ignore-errors
   (delete-file filename))
Macro: with-demoted-errors format body…

このマクロは、いわばignore-errorsの穏やかなバージョンです。これはエラーを完全に抑止するのではなく、エラーをメッセージに変換します。これはメッセージのフォーマットに、文字列formatを使用します。formatは、"Error: %S"のように、単一の‘%’シーケンスを含むべきです。エラーをシグナルすると予測されないが、もし発生した場合は堅牢であるべきようなコードの周囲に、with-demoted-errorsを使用します。このマクロは、condition-caseではなく、condition-case-unless-debugを使用することに注意してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3.4 Error Symbols and Condition Names

エラーをシグナルするとき、想定するエラーの種類を指定するために、エラーシンボル(error symbol)を指定します。エラーはそれぞれ、それをカテゴリー分けするために、ただ1つのエラーシンボルをもちます。これはEmacs Lisp言語で定義されるエラーの、もっとも良い分類方法です。

これら狭義の分類は、エラー条件(error conditions)と呼ばれる、より広義のクラス階層にグループ化され、それらはコンディション名(condition names)により識別されます。そのようなもっとも狭義なクラスは、エラーシンボル自体に属します。つまり各エラーシンボルは、コンディション名でもあるのです。すべての種類のエラー(quitを除く)を引き受けるコンディション名errorに至る、より広義のクラスにたいするコンディション名も存在します。したがって、各エラーは1つ以上のコンディション名をもちます。つまり、errorerrorとは区別されるエラーシンボル、もしかしたらその中間に分類されるものかもしれません。

Function: define-error name message &optional parent

シンボルをエラーシンボルとするために、シンボルは親コンディションをとるdefine-errorで定義されなければなりません。この親は、この種のエラーが属するコンディションを定義します。親の推移的な集合は、常にそのエラーシンボルと、シンボルerrorを含みます。quitはエラーと判断されないので、quitの親の集合は、単なる(quit)です。

親のコンディションに加えて、エラーシンボルはメッセージ(message)をもち、これは処理されないエラーがシグナルされたときプリントされる文字列です。そのメッセージが有効でない場合、エラーメッセージ‘peculiar error’が使用されます。Definition of signalを参照してください。

内部的には、親の集合はエラーシンボルのerror-conditionsプロパティーに格納され、メッセージはエラーシンボルのerror-messageプロパティーに格納されます。

以下は、新しいエラーシンボルnew-errorを定義する例です:

(define-error 'new-error "A new error" 'my-own-errors)

このエラーは複数のコンディション名 — もっとも狭義の分類new-error、より広義の分類を想定するmy-own-errors、およびmy-own-errorsのコンディションすべてを含むerrorで、これはすべての中でもっとも広義なものです。

エラー文字列は大文字で開始されるべきですが、ピリオドで終了すべきではありません。これはEmacsの他の部分との整合性のためです。

もちろんEmacs自身がnew-errorをシグナルすることはありません。あなたのコード内で明示的にsignal(Definition of signalを参照してください)を呼び出すことにより、これを行なうことができるのです。

(signal 'new-error '(x y))
     error→ A new error: x, y

このエラーは、エラーの任意のコンディション名により処理することができます。以下の例は、new-errorとクラスmy-own-errors内の他の任意のエラーを処理します:

(condition-case foo
    (bar nil t)
  (my-own-errors nil))

エラーが分類される有効な方法は、コンディション名による方法で、その名前はハンドラーのエラーのマッチに使用されます。エラーシンボルは、意図されたエラーメッセージと、コンディション名のリストを指定する便利な方法であるという役割だけです。1つのエラーシンボルではなく、コンディション名のリストをsignalに与えるのは、面倒でしょう。

対照的に、コンディション名を伴わずにエラーシンボルだけを使用した場合、それはcondition-caseの効果を著しく減少させるでしょう。コンディション名は、エラーハンドラーを記述するとき、一般性のさまざまなレベルにおいて、エラーをカテゴリー分けすることを可能にします。エラーシンボルを単独で使用することは、もっとも狭義なレベルの分類を除くすべてを捨てることです。

主要なエラーシンボルと、それらのコンディションについては、Standard Errorsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.4 Cleaning Up from Nonlocal Exits

unwind-protect構成は、データ構造を一時的に不整合な状態に置くときは、重要です。これはエラーやthrouのイベントにより、再びデータを整合された状態にすることができます(バッファー内容の変更だけに使用される、他のクリーンアップ構成は、アトミックな変更グループです。Atomic Change Groupsを参照してください)。

Special Form: unwind-protect body-form cleanup-forms…

unwind-protectは、制御がbody-formを離れる場合に、cleanup-formsが評価されるという保証の下、なにが起こった可に関わらず、body-formを実行します。body-formは通常どおり完了するかもしれず、unwind-protectの外でthrowが実行されたり、エラーが発生するかもしれませんが、cleanup-formsは評価されます。

body-formが正常に終了した場合、unwind-protectcleanup-formsを評価した後で、body-formの値をreturnします。body-formが終了しなかった場合、unwind-protectは通常の意味における値は、returnしません。

unwind-protectにより保護されるのは、body-formだけです。cleanup-forms自体の任意のフォームが、(throwまたはエラーにより)非ローカルにexitした場合、unwind-protectは残りのフォームが評価されることを保証しませんcleanup-formsの中の1つが失敗することが問題となる場合は、そのフォームの周囲に他のunwind-protectを配して保護します。

現在アクティブなunwind-protectフォーム数と、ローカルの変数バインディング数の和は、max-specpdl-size(Local Variablesを参照してください)により制限されます。

たとえば、以下は一時的な使用のために不可視のバッファーを作成して、終了する前に確実にそのバッファーをkillする例です:

(let ((buffer (get-buffer-create " *temp*")))
  (with-current-buffer buffer
    (unwind-protect
        body-form
      (kill-buffer buffer))))

(kill-buffer (current-buffer))のように記述して、変数bufferを使用せずに、同様のことを行えると思うかもしれません。しかし上の例は、別のバッファーにスイッチしたときにbody-formでエラーが発生した場合、より安全なのです(一時的なバッファーをkillするとき、そのバッファーがカレントとなることを確実にするために、かわりにbody-formの周囲にsave-current-bufferを記述することもできます)。

Emacsには、上のコードとおおよそ等しいコードに展開される、with-temp-bufferという標準マクロが含まれます(Current Bufferを参照してください)。このマニュアル中で定義されるいくつかのマクロは、この方法でunwind-protectを使用します。

以下は、FTPパッケージ由来の、実際の例です。これは、リモートマシンへの接続の確立を試みるために、プロセス(Processesを参照してください)を作成します。関数ftp-loginは、関数のライター(writer)が予想できないことによる多くの問題から非常に影響を受けるので、失敗イベントでプロセスの削除を保証するフォームで保護されています。そうしないと、Emacsは無用なサブプロセスで一杯になってしまうでしょう。

(let ((win nil))
  (unwind-protect
      (progn
        (setq process (ftp-setup-buffer host file))
        (if (setq win (ftp-login process host user password))
            (message "Logged in")
          (error "Ftp login failed")))
    (or win (and process (delete-process process)))))

この例には小さなバグがあります。ユーザーがquitするためにC-gとタイプした場合、関数ftp-setup-bufferがreturnした後、即座にquitが発生しますが、それは変数processがセットされる前なので、そのプロセスはkillされないでしょう。このバグを簡単に訂正する方法はありませんが、少なくともこれは非常に稀なことだと言えます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11 Variables

変数(variable)とは、プログラム内で値を表すために使用される名前です。Lispでは、変数はそれぞれLispシンボルとして表されます(Symbolsを参照してください)。変数名は単にそのシンボルの名前であり、変数の値はそのシンボルの値セル(value cell)に格納されます6Symbol Componentsを参照してください。Emacs Lispでは、シンボルを変数として使用することは、同じシンボルを関数名として使用することと関係ありません。

このマニュアル中で前に記したとおり、Lispプログラムはまず第1にLispオブジェクトとして表され、副次的にテキストとして表現されます。Lispプログラムのテキスト的な形式は、そのプログラムを構成するLispオブジェクトの入力構文により与えられます。したがって、Lispプログラム内の変数のテキスト的な形式は、その変数を表すシンボルの入力構文を使用して記述されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.1 Global Variables

変数を使用するための一番シンプルな方法は、グローバル(globally)に使用する方法です。これは、ある時点でその変数はただ1つの値をもち、その値が(少なくともその時点では)Lispシステム全体で効果をもつことを意味します。あらたな値を指定するまで、その値が効果をもちます。新しい値で古い値を置き換えるとき、古い値を追跡する情報は変数内に残りません。

シンボルの値はsetqで指定します。たとえば、

(setq x '(a b))

これは、変数xに値(a b)を与えます。setqはスペシャルフォームであることに注意してください。これは1番目の引数(変数の名前)は評価しませんが、2番目の引数(新しい値)は評価します。

変数が1度値をもつと、そのシンボル自身を式として使用することにより、参照することができます。したがって、

x ⇒ (a b)

これは上記のsetqフォームが実行された場合です。

同じ変数を再びセットした場合、新しい値は古い値を置き換えます:

x
     ⇒ (a b)
(setq x 4)
     ⇒ 4
x
     ⇒ 4

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2 Variables that Never Change

Emacs Lispでは、特定のシンボルは、通常は自分自身に評価されます。これらのシンボルにはnilt、同様に名前が‘:’で始まる任意のシンボル(これらはキーワードと呼ばれます)が含まれます。これらのシンボルは、リバインドや、値の変更はできません。niltへのセットやリバインドは、setting-constantエラーをシグナルします。これはキーワード(名前が‘:’で始まるシンボル)についても当てはまります。ただしキーワードが標準のobarrayにinternされている場合、そのようなシンボルを自分自身にセットしてもエラーになりません。

nil ≡ 'nil
     ⇒ nil
(setq nil 500)
error→ Attempt to set constant symbol: nil
Function: keywordp object

この関数は、objectが‘:’で始まる名前のシンボルで、標準のobarrayにinternされているの場合はt、それ以外はnilをreturnします。

これらの定数はスペシャルフォームdefconst(Defining Global Variablesを参照してください)を使用して定義された“定数(constant)”とは、根本的に異なります。defconstフォームは、人間の読み手に値の変更を意図しない変数であることを知らせる役目は果たしますが、実際にそれを変更しても、Emacsはエラーを起こしません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.3 Local Variables

グローバル変数は、新しい値で明示的に置き換えるまで値が持続します。変数にローカル値(local value) — Lispプログラム内の特定の部分で効果をもつを与えると便利なときがあります。変数がローカル値をもつとき、わたしたちは変数がその値にローカルにバインド(locally bound)と言い、その変数をローカル変数(local variable)と呼びます。

たとえば、関数が呼び出されるとき、関数の引数となる変数はローカル値(その関数の呼び出しにおいて実際の引数に与えられた値)を受け取ります。これらのローカルバインディングは、その関数のbody内で効果をもちます。他にも、たとえばスペシャルフォームletは特定の変数にたいして明示的にローカルなバインディングを確立し、これはletフォームのbody内で効果を持ちます。

これにたいしてグローバルなバインディング(global binding)とは、(概念的には)グローバルな値が保持される場所です。

ローカルバインディングを確立すると、その変数の以前の値は他の場所に保存されます(または失われます)。わたしたちはこれを、以前の値がシャドーされた(shadowed)と言います。シャドーはグローバル変数とローカル変数の両方で発生し得ます。ローカルバインディングが効果を持つとき、ローカル変数にsetqを使用することにより、ローカルバインディングに指定された値を格納します。ローカルバインディングが効果を持たなくなったとき、以前にシャドーされた値が復元されます(または失われます)。

変数は同時に複数のローカルバインディングを持つことができます(たとえばその変数をバインドするネストされたlet)。カレントバインディング(current binding)とは、実際に効果を持つローカルバインディングのことです。カレントバインディングは、その変数の評価によりreturnされる値を決定し、setqにより影響を受けるバインディングです。

ほとんどの用途において、“最内(innermost)”のローカルバインディング、ローカルバインディングがないときはグローバルバインディングを、カレントバインディングと考えることができます。より正確に言うと、スコープルール(scoping rule)と呼ばれるルールは、プログラム内でローカルバインディングが効果を持つ任意の与えられた場所を決定します。Emacs Lispのスコープルールはダイナミックスコープ(dynamic scoping)と呼ばれ、これは単に実行中のプログラム内の与えられた位置でのカレントバインディングを示し、その変数がまだ存在する場合は、その変数にたいしてもっとも最近作成されたバインディングです。ダイナミックスコープについての詳細と、その代替であるレキシカルスコープ(lexical scoping)と呼ばれるスコープルールについては、Scoping Rules for Variable Bindingsを参照してください。

スペシャルフォームletおよびlet*は、ローカルバインディングを作成するために存在します:

Special Form: let (bindings…) forms…

このスペシャルフォームは、bindingsにより指定される特定の変数セットにたいするローカルバインディングをセットアップしてから、formsのすべてをテキスト順に評価します。これはforms内の最後のフォームの値をreturnします。

bindingsの各バインディングは2つの形式のどちらかです。(i) シンボルの場合。この場合、そのシンボルはnilにローカルにバインドされます。(ii) フォーム(symbol value-form)のリストの場合。この場合symbolvalue-formを評価した結果にローカルにバインドされます。value-formが省略された場合は、nilが使用されます。

bindings内のすべてのvalue-formは、シンボルがそれらにバインドされるに、記述された順番に評価されます。以下は例では、zyの新しい場合(つまり1)にではなく、古い値(つまり2)にバインドされます。

(setq y 2)
     ⇒ 2
(let ((y 1)
      (z y))
  (list y z))
     ⇒ (1 2)
Special Form: let* (bindings…) forms…

このスペシャルフォームはletと似ていますが、次の変数値にたいするローカル値を計算する前に、ローカル値を計算してそれを変数にバインドします。したがて、bindings内の式は、このlet*フォーム内の前のシンボルのバインドを参照できます。以下の例を、上記letの例と比較してください。

(setq y 2)
     ⇒ 2
(let* ((y 1)
       (z y))    ; yの値に今計算されたばかりの値を使用する。
  (list y z))
     ⇒ (1 1)

以下は、ローカルバインディングを作成する、他の機能のリストです:

変数はバッファーローカルなバインディングを持つこともできます(Buffer-Local Variablesを参照してください)。数は多くありませんが、端末ローカル(terminal-local)なバインディングをもつ変数もあります(Multiple Terminalsを参照してください)これらの種類のバインディングは、通常のローカルバインディングのように機能することもありますが、これらはEmacs内の“どこ”であるかに依存してローカライズされます。

User Option: max-specpdl-size

この変数は、ローカルな変数バインディングと、unwind-protectにゆるクリーンアップ(Cleaning Up from Nonlocal Exitsの総数にたいする制限を定義し、この変数を越えるとEmacsはエラー(データに関するエラー"Variable binding depth exceeds max-specpdl-size")をシグナルします。

このリミットは、もし超過したときにエラーが関連付けられている場合には、誤って定義された関数による無限再起を避けるための1つの方法になります。ネストの深さにたいする他の制限としては、max-lisp-eval-depthがあります。Evalを参照してください。

デフォルト値は1300です。Lispデバッガーのエントリーしたとき、もし残りが少ないときは、デバッガーを実行するための空きを作るために、値は増加されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.4 When a Variable is “Void”

シンボルの値セル(Symbol Componentsを参照してください)に値が割り当てられていない場合、その変数はvoid(空)であると言います。

Emacs Lispのデフォルトであるダイナミックスコープルール(see section Scoping Rules for Variable Bindings)の下では、値セルはその変数のカレント値(ローカルまたはグローバル)を保持します。値が割り当てられていない値セルは、値セルにnilをもつのとは異なることに注意してください。シンボルnilはLispオブジェクトであり、他のオブジェクトと同様に変数の値となることができます。nilは値なのです。変数がvoidの場合、その変数の評価を試みると、値をreturnするかわりに、void-variableエラーがシグナルされます。

オプションであるレキシカルスコープルール(lexical scoping rule)の下では、値セル保持できるのは、その変数のグローバル値 — 任意のレキシカルバインディング構造の外側の値だけです。変数がレキシカルにバインドされている場合、ローカル値はそのレキシカル環境により決定されます。したがって、これらのシンボルの値セルに値が割り当てられていなくても、変数はローカル値を持つことができます。

Function: makunbound symbol

この関数は、symbolの値セルを空にして、その変数をvoidにします。この関数はsymbolをreturnします。

symbolがダイナミックなローカルバインディングを持つ場合、makunboundはカレントのバインディングをvoidにし、そのローカルバインディングが効果を持つ限りvoidにします。その後、前にシャドーされたローカル値(またはグローバル値)が再び有効になり、再び有効になった値がvoidでなければ、その変数はvoidでなくなります。

いくつか例を示します(ダイナミックバインディングが有効だとします):

(setq x 1)               ; グローバルバインディングに値をセットする。
     ⇒ 1
(let ((x 2))             ; それをローカルにバインドする。
  (makunbound 'x)        ; ローカルバインディングをvoidにする。
  x)
error→ Symbol's value as variable is void: x
x                        ; グローバルバインディングは変更されない。
     ⇒ 1

(let ((x 2))             ; ローカルにバインドする。
  (let ((x 3))           ; もう1度。
    (makunbound 'x)      ; 最内のローカルバインディングをvoidにする。
    x))                  ; それを参照すると、void。
error→ Symbol's value as variable is void: x
(let ((x 2))
  (let ((x 3))
    (makunbound 'x))     ; 内側のバインディングをvoidにしてから取り除く。
  x)                     ; 外側のletバインディングが有効になる。
     ⇒ 2
Function: boundp variable

この関数はvariable(シンボル)がvoidでなければtをreturnし、voidのときはnilをreturnします。

いくつか例を示します(ダイナミックバインディングが有効だとします):

(boundp 'abracadabra)          ; 最初はvoid。
     ⇒ nil
(let ((abracadabra 5))         ; ローカルにバインドする。
  (boundp 'abracadabra))
     ⇒ t
(boundp 'abracadabra)          ; グローバルではまだvoid。
     ⇒ nil
(setq abracadabra 5)           ; グローバルで非voidにする。
     ⇒ 5
(boundp 'abracadabra)
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.5 Defining Global Variables

変数定義(variable definition)とは、そのシンボルをグローバル変数として使用する意図を表明する構成です。これには以下で説明するスペシャルフォームdefvardefconstが使用されます。

変数宣言は3つの目的をもちます。1番目は、コードを読む人にたいして、そのシンボルが特定の方法(変数として)使用されることを意図したものだと知らせることです。2番目は、Lispシステムにたいして、オプションで初期値とドキュメント文字列を与えて、これを知らせることです。3番目は、etagsのようなプログラミングツールにたいして、その変数が定義されている場所を見つけられるように、情報を提供することです。

defconstdefvarの違いは主に、人間の読み手に、値が変更されるかどうかを知らせることにあります。Emacs Lispは実際、defconstで定義された変数の値の変更を妨げません。この2つのフォームの特筆すべき違いは、defconstは無条件で変数を初期化し、defvarは変数が元々voidのときだけ初期化することです。

マスタマイズ可能な変数を定義する場合は、defcustomを使用するべきです(これはサブルーチンとしてdefvarを呼び出します)。Defining Customization Variablesを参照してください。

Special Form: defvar symbol [value [doc-string]]

このスペシャルフォームは、変数としてsymbolを定義します。symbolは評価されないことに注意してください。シンボルはdefvarフォーム内に明示的に表記して定義される必要があります。この変数は特別だとマークされ、これは常にそれがダイナミックにバインドされることを意味します(Scoping Rules for Variable Bindingsを参照してください)。

valueが指定されていてsymbolがvoid(たとえばこのシンボルがダイナミックにバインドされた値を持たないとき。When a Variable is “Void”を参照してください)、valueが評価されて、その結果がsymbolにセットされます。しかしsymbolがvoidでな場合、valueは評価されず、symbolの値は変更されません。valueが省略された場合、いかなる場合もsymbolの値は変更されません。

symbolがカレントバッファー内でバッファーローカルなバインディングをもつ場合、defvarはデフォルト値に作用します。デフォルト値はバッファーローカルなバインディングではなく、バッファーにたいして独立しています。デフォルト値がvoidのときはデフォルト値をセットします。Buffer-Local Variablesを参照してください。

すでにsymbolがレキシカルにバインドされている場合(たとえばレキシカルバインドが有効な状態でletフォーム内にdefvarがあるような場合)、defvarはダイナミックな値をセットします。バインディング構造を抜けるまで、レキシカルバインディングは効果をもちます。Scoping Rules for Variable Bindingsを参照してください。

Emacs Lispモード(eval-defun)でトップレベルのdefvarを評価するとき、eval-defunの特別な機能は、その値がvoidであるかテストすることなく、その変数を無条件にセットします。

引数doc-stringが与えられた場合、それは変数にたいするドキュメント文字列を指定します(そのシンボルのvariable-documentationプロパティーに格納されます)。Documentationを参照してください。

以下にいくつか例を示します。これはfooを定義しますが、初期化は行いません:

(defvar foo)
     ⇒ foo

この例はbarの値を23に初期化して、ドキュメント文字列を与えます:

(defvar bar 23
  "The normal weight of a bar.")
     ⇒ bar

defvarフォームはsymbolをreturnしますが、通常これは値が問題にならないファイル内のトップレベルで使用されます。

Special Form: defconst symbol value [doc-string]

このスペシャルフォームは、ある値としてsymbolを定義して、それを初期化します。これはコードを読む人に、symbolがここで設定される標準的なグローバル値をもち、ユーザーや他のプログラムがそれを変更すべきではないことを知らせます。symbolは評価されないことに注意してください。このシンボルは、defconst内に明示的に記されなければなりません。

defvarと同様、defconstは、変数を特別 — この変数が常にダイナミックにバインドされているという意味 — だとマークします(Scoping Rules for Variable Bindingsを参照してください)。加えて、これはその変数を危険であるとマークします(File Local Variablesを参照してください)。

defconstは常にvalueを評価して、その結果をsymbolの値にセットします。カレントバッファー内でsymbolがバッファーローカルなバインディングをもつ場合、defconstはデフォルト値ではなく、バッファーローカルな値をセットします(しかし、defconstで定義されたシンボルにたいしてバッファーローカルなバインディングを作るべきではありません)。

defconstの使い方の例は、Emacsのfloat-pi — (たとえIndiana State Legislatureが何を試みようと)何者かにより変更されるべきではない、数学定数piにたいする定義です。しかし2番目のdefconstの例のように、これは単にアドバイス的なものです。

(defconst float-pi 3.141592653589793 "The value of Pi.")
     ⇒ float-pi
(setq float-pi 3)
     ⇒ float-pi
float-pi
     ⇒ 3

警告: 変数がローカルバインディングをもつとき(letにより作成された、または関数の引数の場合)に、スペシャルフォームdefconstまたはdefvarを使用すると、これらのフォームはグローバルバインディングではなく、ローカルバインディングをセットします。これは通常、あなたが望むことではないはずです。これを防ぐには、これらのスペシャルフォームをファイル内のトップレベルで使用します。この場所は通常、何のローカルバインディングも効果をもたないので、その変数にたいするローカルバインディングが作成される前にファイルがロードされることが確実だからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.6 Tips for Defining Variables Robustly

値が関数(または関数のリスト)であるような変数を定義するとき、変数の名前の最後に‘-function’(または‘-functions’)を使います。

他にも、変数名に関する慣習があります。以下はその完全なリストです:

…-hook

変数はノーマルフックです(Hooksを参照してください)。

…-function

値は関数です。

…-functions

値は関数のリストです。

…-form

値はフォーム(式)です。

…-forms

値はフォーム(式)のリストです。

…-predicate

値は述語(predicate) — 1つの引数をとる関数 — で、引数が“正しい(good)”"場合は非nil、“正しくない(bad)”場合はnilをreturnします。

…-flag

nilか、そうでないかだけが意味をもつような値です。そのような変数は結局、やがては多くの値をもつことが多いので、この慣習を強く推奨はしません。

…-program

値はプログラム名です。

…-command

値は完全なシェルコマンドです。

…-switches

値はコマンドにたいして指定するオプションです。

変数を定義するときは、その変数を“安全(safe)”とマークすべきか、それとも“危険(risky)”とマークすべきかを常に考慮してください。File Local Variablesを参照してください。

複雑な値を保持する変数(バインディングをもつkeymapなど)を定義、または初期化するとき、以下のように値の計算をすべてdefvarの中に配置するのが最良です:

(defvar my-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "\C-c\C-a" 'my-command)
    …
    map)
  docstring)

この方法にはいくつかの利点があります。1つ目は、ファールをロード中にユーザーが中断した場合、変数はまだ初期化されていないか、初期化されているかのどちらかで、その中間ということはありません。まだ初期化されていない場合、ファイルをリロードすれば正しく初期化されます。2つ目は、1度初期化された変数は、ファイルをリロードしても変更されないことです。コンテンツの一部を変更(たとえばキーのリバインド)するフックをユーザーが実行した場合などに、これは重要です。3つ目は、C-M-xdefvarを評価すると、そのマップは完全に再初期化されることです。

defvarフォーム内に多すぎるコードを配置することには不利な点が1つあります。ドキュメント文字列が変数の名前から離れた場所に配置されることです。これを避ける安全な方法は以下の方法です:

(defvar my-mode-map nil
  docstring)
(unless my-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "\C-c\C-a" 'my-command)
    …
    (setq my-mode-map map)))

これは初期化をdefvarの内側に配置した場合とまったく同じ利点をもちますが、変数を再度初期化したい場合は、各フォームにたいして1回ずつ、2度C-M-xをタイプしなければならない点が異なります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7 Accessing Variable Values

変数を参照する通常の方法は、それに名前をつけるシンボルを記述する方法です。The usual way to reference a variable is to write the symbol which names it. Symbol Formsを参照してください。

時には、実行時にのみ決定される変数を参照したいときがあるかもしれません。そのような場合、プログラム中のテキストで、変数名を指定することはできません。その値を抽出するために、symbol-valueを使うことができます。

Function: symbol-value symbol

この関数は、symbolの値セルに格納された値をreturnします。これには、その変数の(ダイナミックな)カレント値が格納された場所です。その変数がローカルバインディングをもたない場合は、単にその変数のグローバル値になります。変数がvoidの場合、void-variableはエラーをシグナルします。

その変数がレキシカルにバインドされている場合、symbol-valueにより報告される値は、その変数のレキシカル値と同じである必要はありません。レキシカル値はそのシンボルの値セルではなく、レキシカル環境により決定されます。Scoping Rules for Variable Bindingsを参照してください。

(setq abracadabra 5)
     ⇒ 5
(setq foo 9)
     ⇒ 9
;; ここでシンボルabracadabra
;;   値がテストされるシンボル。
(let ((abracadabra 'foo))
  (symbol-value 'abracadabra))
     ⇒ foo
;; ここでは、abracadabraの値、
;;   つまりfooが、
;;   値をテストされるシンボル。
(let ((abracadabra 'foo))
  (symbol-value abracadabra))
     ⇒ 9
(symbol-value 'abracadabra)
     ⇒ 5

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.8 Setting Variable Values

ある変数の値を変更する通常の方法は、スペシャルフォームsetqを使用する方法です。実行時に変数選択を計算する必要がある場合は、関数setを使用します。

Special Form: setq [symbol form]…

このスペシャルフォームは、変数の値を変更するための、もっとも一般的な方法です。symbolにはそれぞれ、新しい値(対応するformが評価された結果)を与えられます。そのシンボルのカレントバインディングは変更されます。

setqsymbolを評価せず、記述されたシンボルをセットします。この引数のことを、自動的にクォートされた(automatically quoted)と呼びます。setqの‘q’は、“quoted(クォートされた)”が由来です。

setqフォームの値は、最後のformの値となります。

(setq x (1+ 2))
     ⇒ 3
x                   ; ここでxはグローバル値をもつ。
     ⇒ 3
(let ((x 5))
  (setq x 6)        ; xのローカルバインディングをセット。
  x)
     ⇒ 6
x                   ; グローバル値は変更されない。
     ⇒ 3

1番目のformが評価されてから1番目のsymbolがセットされ、次に2番目のformが評価されてからsymbolが評価されて、...となることに注意してください:

(setq x 10          ; ここで、xがセットされるのは
      y (1+ x))     ;   yの計算前であることに注目。
     ⇒ 11
Function: set symbol value

この関数は、symbolの値セルにvalueを配置します。これはスペシャルフォームではなく関数なので、シンボルにセットするために、symbolに記述された式は評価されます。return値はvalueです。

ダイナミックな変数バインドが有効な場合(デフォルト)、setは自身の引数symbolを評価しますが、setqは評価しないという点を除き、setsetqと同じ効果をもちます。しかし、変数がレキシカルバインドの場合、setは変数のダイナミックな値に影響し、setqは変数のカレント値(レキシカル値)に影響します。Scoping Rules for Variable Bindingsを参照してください。

(set one 1)
error→ Symbol's value as variable is void: one
(set 'one 1)
     ⇒ 1
(set 'two 'one)
     ⇒ one
(set two 2)         ; twoは、シンボルoneに評価される。
     ⇒ 2
one                 ; したがってoneがセットされる。
     ⇒ 2
(let ((one 1))      ; oneのこのバインディングがセットされるのであって
  (set 'one 3)      ;   グローバル値はセットされない。
  one)
     ⇒ 3
one
     ⇒ 2

symbolが実際のシンボルでない場合、wrong-type-argumentエラーがシグナルされます。

(set '(x y) 'z)
error→ Wrong type argument: symbolp, (x y)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9 Scoping Rules for Variable Bindings

ある変数にたいするローカルバインディングを作成するとき、そのバインディングはプログラムの限られた一部だけに効果をもちます(see section Local Variables)。このセクションでは、これが正確には何を意味するかについて説明します。

ローカルバインディングはそれぞれ、個別にスコープ(scope: 範囲という意味)エクステント(extent: これも範囲を意味する)をもちます。スコープは、そのバインディングにアクセスできるのが、テキストのソースコードのどこ(where)であるかを示します。エクステントは、プログラムの実行中に、そのバインディングが存在するのがいつ(when)であるかを示します。

デフォルトでは、Emacsが作成したローカルバインディングは、ダイナミックバインディング(dynamic binding)です。このようなバインディングは、ダイナミックスコープ(dynamic scope)をもち、それはプログラムの任意の範囲が、その変数バインディングにアクセスするかもしれないことを意味します。これはダイナミックエクステント(dynamic extent)ももちます。これはそのバインディング構造(letフォームのbodyなど)が実行される間だけ、そのバインディングが存続することを意味します。

Emacsはオプションでレキシカルバインディング(lexical binding)を作成することができます。レキシカルバインディングはレキシカルスコープ(lexical scope)をもち、これはその変数にたいする任意の参照が、バインディング構造内にテキスト的に配置されなければならないことを意味します7。レキシカルバインディングは不定エクステント(indefinite extent)ももちます。これは、ある状況下において、クロージャー(closures)と呼ばれるスペシャルオブジェクトにより、バインディング構造が実行を終えた後でさえも、存続を続けることを意味します。

以降のサブセクションでは、ダイナミックバインディングとレキシカルバインディング、およびEmacs Lispプログラムでレキシカルバインディングを有効にする方法について、より詳細に説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.1 Dynamic Binding

デフォルトでは、Emacsにより作成されるローカル変数のバインディングは、ダイナミックバインディングです。ある変数がダイナミックにバインドされていると、Lispプログラムの実行における任意のポイントでのカレントバインディングは、単にそのシンボルにたいしてもっとも最近作成されたダイナミックなローカルバインディングか、そのようなローカルバインディングが存在しない場合はグローバルバインディングになります。

以下の例のように、ダイナミックバインディングはダイナミックスコープとダイナミック<エクステントをもちます:

(defvar x -99)  ; xは初期値として-99を受け取る。

(defun getx ()
  x)            ; この関数内では、xは“自由”に使用される。

(let ((x 1))    ; xはダイナミックにバインドされている。
  (getx))
     ⇒ 1

;; letフォームが終了した後、
;; xは前の値-99にリバートされる。

(getx)
     ⇒ -99

関数getxxを参照します。defun構造自体の中にxにたいするバインディングが存在しないと意味において、これは“自由”な参照です。xが(ダイナミックに)バインドされているletフォーム内からgetxを呼び出すと、ローカル値(つまり1)が取得されます。しかし、その後letフォームの外側からgetxを呼び出すと、グローバル値(つまり-99)が取得されます。

以下は、setqを使用してダイナミックに変数をバインドする、例をです:

(defvar x -99)      ; xは初期値として-99を受け取る。

(defun addx ()
  (setq x (1+ x)))  ; xに1追加して、新しい値をreturnする。

(let ((x 1))
  (addx)
  (addx))
     ⇒ 3           ; addxを2回呼び出すと、xに2回追加される。

;; letフォームが終了した後、
;; xは前の値-99にリバートされる。

(addx)
     ⇒ -98

Emacs Lispでは、ダイナミックバインディングは、シンプルな方法で実装されています。それぞれのシンボルは、シンボルのカレントのダイナミック値(または値の不在)を指定する値セルをもちます。Symbol Componentsを参照してください。あるシンボルがダイナミックなローカル値を与えられたとき、Emacsは値セルの内容(または値の不在)をスタックに記録し、新しいローカル値を値セルに格納します。バインディング構造が実行を終えたとき、Emacsはスタックから古い値をpopして、値セルにそれを置きます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.2 Proper Use of Dynamic Binding

ダイナミックバインディングは、プログラムにたいしてテキスト的なローカルスコープ内で定義されていない変数を参照することを許す、強力な機能です。しかし、無制限に使用した場合は、プログラムの理解しにくくしてしまうこともあります。このテクニックを使用するために、2つの明解な方法があります:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.3 Lexical Binding

Emacsのバージョン24.1から、オプションの機能としてレキシカルバインディングが導入されました。わたしたちは、この機能の重要さが、将来において重要になることを期待します。レキシカルバインディングは最適化の機会をより広げるので、この機能を使用するプログラムはおそらく、将来のEmacsバージョンで高速に実行されるようになるでしょう。レキシカルバインディングは、わたしたちがEmacsに将来追加したいと考える並列性(concurrency)とも互換をもっています。

レキシカルにバインドされた変数はレキシカルスコープ(lexical scope)をもいます。 これは、その変数にたいする参照は、そのバインディング構造内にテキスト的に配置されなければならないことを意味します。以下は例です (実際にレキシカルバインディングを有功にする方法は、Using Lexical Bindingを参照してください):

(let ((x 1))    ; xはレキシカルにバインドされる。
  (+ x 3))
     ⇒ 4

(defun getx ()
  x)            ; この関数内では、xは“自由”に使用される。

(let ((x 1))    ; xはレキシカルにバインドされる。
  (getx))
error→ Symbol's value as variable is void: x

ここでは、xはグローバル値をもちません。letフォーム内でレキシカルにバインドされたとき、この変数はletのテキスト境界内で使用できます。しかし、このlet内から呼び出されるgetx関数からは、getxの関数定義がletフォームの外側にあるので、使用することができません

レキシカルバインディングが機能する方法を説明します。各バインディング構造は、その構造および構造のローカル値でバインドされるシンボルを指定することにより、レキシカル環境(lexical environment)を定義します。Lispの評価機能(Lisp evaluator)がある変数のカレント値を得たいときは、最初にレキシカル環境内を探します。そこで変数が指定されていなければ、ダイナミック値が格納されるシンボルの値セルを探します。

(内部的には、レキシカル環境はシンボルと値がペアになったalistで、alistの最後の要素はコンスセルではなく、シンボルtです。そのようなalistは、フォームを評価するためのレキシカル環境を指定するために、eval関数の2番目の引数として渡すことができます。Evalを参照してください。しかし、ほとんどのEmacs Lispプログラムは、この方法で直接レキシカル環境を使用するべきではありません。デバッガーのような特化されたプログラムだけが使用すべきです。)

レキシカルバインディングは、不定エクステント(indefinite extent)をもちます。バインディング構造が終了した後でも、そのレキシカル環境はクロージャー(closures)と呼ばれるLispオブジェクト内に“保持”されます。クロージャーは、レキシカルバインディングが有効な、名前つきまたは無名(anonymous)の関数が作成されたときに作成されます。詳細は、Closuresを参照してください。

クロージャーが関数として呼び出されたとき、その関数の定義内のレキシカル変数にたいする任意の参照は、レキシカル環境を維持するために使用されます。以下は例です:

(defvar my-ticker nil)   ; クロージャーを格納するために
                         ; この変数を使用する。

(let ((x 0))             ; xはレキシカルにバインドされる。
  (setq my-ticker (lambda ()
                    (setq x (1+ x)))))
    ⇒ (closure ((x . 0) t) ()
          (setq x (1+ x)))

(funcall my-ticker)
    ⇒ 1

(funcall my-ticker)
    ⇒ 2

(funcall my-ticker)
    ⇒ 3

x                        ; xはグローバル値をもたないことに注意。
error→ Symbol's value as variable is void: x

letバインディングは、内部に変数xをもつレキシカル環境を定義し、これは0にローカルにバインドされます。このバインディング構造内で、xを1層化し、増加された値をreturnするクロージャーを定義しています。このラムダ式は自動的にクロージャーになり、たとえlet構造を抜けた後でも、その内部ではレキシカル環境が存続します。クロージャーを評価するときは毎回、レキシカル環境内のxのバインディングが使用され、xが増加されます。

symbol-valueboundpsetのような関数は、変数のダイナミックバインディング(つまりそのシンボルの値セル)だけを取得(または変更)することに注意してください。defun(またはdefmacro)のbody内のコードも、周囲のレキシカル変数は参照できません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.4 Using Lexical Binding

Emacs Lispファイルをロードしたり、Lispバッファーを評価するとき、バッファーローカルな変数lexical-bindingが非nilの場合は、レキシカルバインディングが有効になります:

Variable: lexical-binding

このバッファーローカルな変数が非nilの場合、Emacs Lispファイルおよびバッファーは、ダイナミックバインディングではなくレキシカルバインディングを使用して評価されます(しかし、特別な変数はダイナミックにバインドされたままです。以下を参照してください)。nilの場合、すべてのローカル変数にたいしてダイナミックバインディングが使用されます。この変数は通常、ファイルローカル変数として、Emacs Lispファイル全体にたいしてセットされます(File Local Variablesを参照してください)。他のファイルローカル変数などとは異なり、ファイルの最初の行でセットされなければならないことに注意してください。

eval呼び出しを使用して、Emacs Lispコードを直接評価するとき、evallexical引数が非nilの場合は、レキシカルバインディングが有効になります。Evalを参照してください。

レキシカルバインディングが有効な場合でも、特定の変数はダイナミックにバインドされたままです。これらはスペシャル変数(special variable)と呼ばれます。defvardefcustomdefconstで定義されたすべての変数は、スペシャル変数です(Defining Global Variablesを参照してください)。その他のすべての変数はレキシカルバインディングの対象になります。

Function: special-variable-p symbol

この関数は、symbolがスペシャル変数(つまり変数がdefvardefcustomdefconstによる定義をもつ)の場合は非nilをreturnします。それ以外では、return値はnilになります。

関数内での通常の引数としてスペシャル変数を使用することは、推奨されません。レキシカルバインディングモードが有効なときにこれを行うと、不定な動作が起こります(あるときはレキシカルバインディング、またあるときはダイナミックバインディングのように)。

Emacs Lispプログラムをレキシカルバインディングに変換するのは簡単です。最初にEmacs Lispソースファイルのヘッダー行でlexical-bindingtして、ファイルローカル変数を追加します(File Local Variablesを参照してください)。次に、意図せずレキシカルにバインドしてしまわないように、ダイナミックなバインドをもつ必要がある変数が変数定義をもつことを、各変数ごとにチェックします。

どの変数が変数定義をもつ必要があるか見つけるシンプルな方法は、ソースファイルをバイトコンパイルすることです。Byte Compilationを参照してください。letフォームの外で非スペシャル変数が使用されている場合、バイトコンパイラーは“free variable”にたいする参照または割り当てについて警告するでしょう。非スペシャル変数がバインドされているが、letフォーム内で使用されていない場合、バイトコンパイラーは“unused lexical variable”に関して警告するでしょう。バイトコンパイラーは、スペシャル変数を関数の引数として使用している場合も、問題を警告します。

(使用されていない変数についての警告を抑制するためには、単に変数名をアンダースコアーで開始します。そうすれば、バイトコンパイラーはこれを、変数が使用されないことを示すと解釈します。)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.10 Buffer-Local Variables

グローバルおよびボーカルな変数バインディングは、1つの形式、または別の形式で、ほとんどのプログラミング言語で見つけることができます。しかしEmacsは、1つのバッファーだけに適用されるバッファーローカル(buffer-local)なバインディングの用に、普通にはない種類の変数バインディングもサポートします。ある変数にたいして異なるバッファーごとに別の亜Q体をもつのは、重要なカスタマイズ方法です(変数は端末ごとにローカルなバインディングをもつこともできます。Multiple Terminalsを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.10.1 Introduction to Buffer-Local Variables

バッファーローカル変数は、特定のバッファーに関連づけられた、バッファーローカルなバインディングをもちます。このバインディングは、そのバッファーがカレントのときに効果をもち、カレントでないときは効果がありません。バッファーローカルなバインディングが効力をもつときにその変数をセットした場合、そのバインディングは新しい値をもちますが、他のバインディングは変更されません。これは、バッファーローカルなバインディングを作成したバッファーだけで変更が見えることを意味します。

その変数にたいする特定のバッファーに関連づけられていない通常のバインディングは、デフォルトバインディング(default binding)と呼ばれます。ほとんどの場合、これはグローバルバインディングです。

変数は、あるバッファーではバッファーローカルなバインディングをもつことができ、他のバッファーではもたないことができます。デフォルトバインディングは、その変数にたいして自身のバインディングをもたない、すべてのバッファーで共有されます(これには、新たに作成されたバッファーが含まれます)。ある変数にたいしてバッファーローカルなバインディングをもたないバッファーでその変数をセットすると、デフォルトバインディングがセットされるので、それはデフォルトバインディングを参照するすべてのバッファーで新しい値を見ることができます。

バッファーローカルなバインディングのもっとも一般的な使用は、目はーモードがコマンドの動作を制御するために変数を変更する場合です。たとえばCモードやLispモードは、空行だけがパラグラフの区切りになるように、変数paragraph-startをセットします。これらのモードは、CモードやLispモードになるようなバッファー内でこの変数をバッファーローカルにすることによりこれを行い、その後そのモードにたいして新しい値をセットします。Major Modesを参照してください。

バッファーローカルなバインディングを作成する通常の方法は、make-local-variableによる方法で、これは通常メジャーモードが使用します。これはカレントバッファーだけに効果があります。その他すべてのバッファー(まだ作成されていないバッファーを含む)は、それらのバッファー自身が明示的にバッファーローカルなバインディングを与えられるまで、デフォルト値の共有を続けます。

変数を自動的にバッファーローカルになるようにマークする、より強力な操作は、make-variable-buffer-localを呼び出すことにより行われます。これは、たとえその変数がまだ作成されていなくても、変数をすべてのバッファーにたいしてローカルにすると考えることができます。より正確には、変数を自動的にセットすることにより、その変数がカレントバッファーにたいしてローカルでなくても、変数をローカルにする効果があります。すべてのバッファーは最初は通常のようにデフォルト値を共有しますが、この変数をセットすることによりカレントバッファーにたいしてバッファーローカルなバインディングを作成します。新たな値はバッファーローカルなバインディングに格納され、デフォルトバインディングは変更されずに残ります。これは、任意のバッファーでsetqによりデフォルト値を変更できないことを意味します。変更する唯一の方法は、setq-defaultだけです。

警告: ある変数が1つ以上のバッファーでバッファーローカルなバインディングをもつとき、letはそのとき効果をもつ変数のバインディングをリバインドします。たとえばq、カレントバッファーがバッファーローカルな値をもつ場合、letは一時的にそれをリバインドします。効果をもつバッファーローカルなバインディングが存在しない場合、letはデフォルト値をリバインドします。letの内部で、別のバインディングが効力をもつ別のバッファーをカレントバッファーにすると、それ以上letバインディングを参照できなくなります。他のバッファーにいる間にletを抜けると、(たとえそれが正しくても)バインディングの解消を見ることはできません。以下にこれを示します:

(setq foo 'g)
(set-buffer "a")
(make-local-variable 'foo)
(setq foo 'a)
(let ((foo 'temp))
  ;; foo ⇒ 'temp  ; バッファー‘a’内でのletバインディング
  (set-buffer "b")
  ;; foo ⇒ 'g     ; fooは‘b’にたいしてローカルではないためグローバル値
  body…)
foo ⇒ 'g        ; exitによりバッファー‘a’のローカル値が復元されるが、
                 ; バッファー‘b’では見ることができない
(set-buffer "a") ; ローカル値が復元されたことを確認
foo ⇒ 'a

body内のfooにたいする参照は、バッファー‘b’のバッファーローカルなバインディングにアクセスすることに注意してください。

あるファイルがローカル変数の値をセットする場合、これらの変数はファイルをvisitするときバッファーローカルな値になります。File Variables in The GNU Emacs Manualを参照してください。

バッファーローカル変数を、端末ローカル(terminal-local)にすることはできません(Multiple Terminalsを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.10.2 Creating and Deleting Buffer-Local Bindings

Command: make-local-variable variable

この関数はカレントバッファー内で、variable(シンボル)にたいして、バッファーローカルなバインディングを作成します。他のバッファーは影響を受けません。returnされる値は、variableです。

variableのバッファーローカルな値は最初、以前にvariableがもっていた値と同じ値をもちます。variableがvoidのときは、voidのままです。

;; バッファー‘b1’で行う:
(setq foo 5)                ; すべてのバッファーに影響する。
     ⇒ 5
(make-local-variable 'foo)  ; b1’内でローカルになった。
     ⇒ foo
foo                         ; 値は変更されない。
     ⇒ 5
(setq foo 6)                ; b1’内で値を変更。
     ⇒ 6
foo
     ⇒ 6
;; バッファー‘b2’では、値は変更されていない。
(with-current-buffer "b2"
  foo)
     ⇒ 5

変数をletバインディングでバッファーローカルにしても、letへの出入り時の両方で、これを行うバッファーがカレントでない場合は、信頼性がありません。これはletがバインディングの種類を区別しないからです。letはバインディングを作成される変数だけを知るからです。

変数が端末ローカル(Multiple Terminalsを参照してください)の場合、この関数はエラーをシグナルします。そのような変数は、バッファーローカルなバインディングをもつことができません。

警告: フック変数にたいしてmake-local-variableを使用しないでください。フック変数は、add-hookまたはremove-hooklocal引数を使用した場合、必要に応じて自動的にバッファーローカルになります。

Macro: setq-local variable value

このマクロはカレントバッファー内でvariableにたいしてバッファーローカルなバインディングを作成して、それにバッファーローカルな値valueを与えます。このマクロはmake-local-variableに続けてsetqを呼び出すのと同じです。variableはクォートされていないシンボルです。

Command: make-variable-buffer-local variable

このコマンドは、variable(シンボル)が自動的にバッファーローカルになるようにマークするので、それ以降にその変数へのセットを試みると、その時点でカレントのバッファーにローカルになります。しばしば混乱を招くmake-local-variableとは異なり、これが取り消されることはなく、すべてのバッファー内での変数の挙動に影響します。

この機能に特有の欠点は、(letまたはその他のバインディング構造による)変数のバインディングが、その変数にたいするバッファーローカルなバインディングを作成しないことです。(setまたはsetqによる)変数のセットだけは、その変数がカレントバッファーで作成されたletスタイルのバインディングをもたないので、ローカルなバインディングを作成します。

variableがデフォルト値をもたない場合、このコマンドの呼び出しはnilのデフォルト値を与えます。variableがすでにデフォルト値をもつ場合、その値は変更されずに残ります。それ以降にvariableにたいしてmakunboundを呼び出すと、バッファーローカル値をvoidにして、デフォルト値は影響を受けずに残ります。

return値はvariableです。

警告: ユーザーオプション変数にたいしては、ユーザーは異なるバッファーにたいして異なるカスタマイズを望むかもしれないので、make-variable-buffer-localを使うべきだと決め込むべきではありません。ユーザーは、望むなら任意の変数をローカルにできます。それらの選択の余地を残すほうがよいでしょう。

make-variable-buffer-localを使用すべきときは、複数のバッファーが同じバインディングを共有しないことが自明な場合です。たとえば、バッファーごとに個別な値をもつことに依存するLispプログラム内の内部プロセスにたいして変数が使用されるときは、make-variable-buffer-localの使用が最善の解決策になるかもしれません。

Macro: defvar-local variable value &optional docstring

このマクロはvariableを、初期値valueおよびdocstringの変数として定義して、それを自動的にバッファーローカルとマークします。これはdefvarの後につづけてmake-variable-buffer-localを呼び出すのと同じです。variableはクォートされていないシンボルです。

Function: local-variable-p variable &optional buffer

これはvariableがバッファーbuffer(デフォルトはカレントバッファー)内でバッファーローカルのときはt、それ以外はnilをreturnします。

Function: local-variable-if-set-p variable &optional buffer

これはvariableがバッファーbuffer内でバッファーローカル値をもつか、自動的にバッファーローカルになる場合は、tをreturnします。それ以外はnilをreturnします。bufferが省略またはnilの場合のデフォルトは、カレントバッファーです。

Function: buffer-local-value variable buffer

この関数は、バッファーbuffer内の、variable(シンボル)のバッファーローカルなバインディングをreturnします。variableがバッファーbuffer内でバッファーローカルなバインディングをもたない場合は、かわりにvariableのデフォルト値(The Default Value of a Buffer-Local Variable)をreturnします。

Function: buffer-local-variables &optional buffer

この関数はバッファーbuffer内のバッファーローカル変数を表すリストをreturnします(bufferが省略された場合はカレントバッファーが使用されます)。リストの各要素は通常、(sym . val)という形式をもちます。ここでsymはバッファーローカル変数(シンボル)、valはバッファーローカル値です。しかしbuffer内の、ある変数のバッファーローカルなバインディングがvoidのtきは、その変数に対応するリスト要素は単にsymになります。

(make-local-variable 'foobar)
(makunbound 'foobar)
(make-local-variable 'bind-me)
(setq bind-me 69)
(setq lcl (buffer-local-variables))
    ;; 最初はすべてのバッファー内でローカルなビルトイン変数:
⇒ ((mark-active . nil)
    (buffer-undo-list . nil)
    (mode-name . "Fundamental")
    …
    ;; 次にビルトインでないバッファーローカル変数。
    ;; This one is buffer-local and void:
    foobar
    ;; これはバッファーローカルでvoidではない:
    (bind-me . 69))

このリスト内のコンスセルのCDRに新たな値を格納しても、その変数のバッファーローカル値は変化しないことに注意してください。

Command: kill-local-variable variable

この関数はカレントバッファー内のvariable(シンボル)にたいするバッファーローカルなバインディング(もしあれば)を削除します。その結果として、このバッファー内でvariableのデフォルトバインディングが可視になります。これは通常、variableの値を変更します。デフォルト値は削除されたバッファーローカル値とは異なるのが普通だからです。

セットしたとき自動的にバッファーローカルになる変数のバッファーローカルなバインディングをkillした場合は、これによりカレントバッファーな意でデフォルト値が可視になります。しかし、変数を再度セットすると、その変数にたいするバッファーローカルなバインディングが再作成されます。

kill-local-variablevariableをreturnします。

この関数はコマンドです。なぜなら、バッファーローカル変数のインタラクティブな作成が有用な場合があるように、あるバッファーローカル変数のインタラクティブなkillが有用な場合があるからです。

Function: kill-all-local-variables

この関数は、“permanent(永続的)”とマークされた変数、およびpermanent-local-hookプロパティーに非nilをもつローカルフック関数(Setting Hooks)を除き、カレントバッファーのすべてのバッファーローカルなバインディングを解消します。結果として、そのバッファーはほとんどの変数のデフォルト値を参照するようになります。

この関数は、そのバッファーに関係のあるその他の特定の情報もリセットします。これはローカルキーマップ(local keymap)をnil、構文テーブル(syntax table)を(standard-syntax-table)の値、大文字小文字テーブル(case table)を(standard-case-table)、abbrevテーブル(abbrev table)をfundamental-mode-abbrev-tableの値にセットします。

この関数が1番最初に行うのは、ノーマルフックchange-major-mode-hook(以下参照)の実行です。

各メジャーモードコマンドは、Fundamentalモードにスイッチする効果をもち、以前のメジャーモードのほとんどの効果を消去する、この関数を呼び出すことにより開始されます。この関数が処理を行うのを確実にするために、メジャーモードがセットする変数はpermanentとマークすべきではありません。

kill-all-local-variables returns nil.

Variable: change-major-mode-hook

関数kill-all-local-variablesは、何か他のことを行う前に、まずこのノーマルフックを実行します。この関数はメジャーモードにたいして、ユーザーが他のメジャーモードにスイッチした場合に行われる、何か特別なことを準備する方法を与えます。この関数は、ユーザーがメジャーモードを変更した場合に忘れられるべき、バッファー固有のマイナーモードにたいしても有用です。

最善の結果を得るために、この変数をバッファーローカルにすれば、処理が終了したときに消えるので、以降のメジャーモードに干渉しなくなります。Hooksを参照してください。

変数名(シンボル)が非nilpermanent-localプロパティーをもつ場合、バッファーローカル変数はpermanent(永続的)です。そのような変数はkill-all-local-variablesの影響を受けず、したがってメジャーモードの変更によりそれらのローカルバインディングは作成されません。permanentなローカル変数は、ファイルの内容を編集する方法などより、どこから読み込んだファイルか、あるいはどのように保存するかといったことに関連するデータに適しています。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.10.3 The Default Value of a Buffer-Local Variable

バッファーローカルなバインディングをもつ変数のグローバル値も、デフォルト値(default)値と呼ばれます。なぜなら、その変数にたいしてカレントバッファーも選択されたフレームもバインディングをもたない場合には、その値が常に効果をもつからです。

関数default-valueおよびsetq-defaultは、カレントバッファーがバッファーローカルなバインディングをもつかどうかに関わらず、その変数のデフォルト値にアクセスまたは変更します。たとえば、ほとんどのバッファーにたいして、paragraph-startのデフォルトのセッティングを変更するために、setq-defaultを使用できます。そして、この変数にたいするバッファーローカルな値をもつCモードやLispモードにいるときでさえ、これは機能します。

スペシャルフォームdefvarおよびdefconstも、バッファーローカルな値ではなく、(もし変数にセットする場合は)デフォルト値をセットします。

Function: default-value symbol

この関数は、symbolのデフォルト値をreturnします。これは、この変数にたいして独自の値をもたないバッファーやフレームから参照される値です。symbolがバッファーローカルでない場合、これはsymbol-value(Accessing Variable Valuesを参照してください)と同じです。

Function: default-boundp symbol

関数default-boundpは、symbolのデフォルト値がvoidでないか報告します。(default-boundp 'foo)nilをreturnした場合、(default-value 'foo)はエラーになります。

default-boundpdefault-valueんびたいして、boundpsymbol-valueにたいする述語です。

Special Form: setq-default [symbol form]…

このスペシャルフォームは、各symbolに、対応するformを評価した結果を新たなデフォルト値として与えます。これはsymbolを評価しませんが、formは評価します。setq-defaultフォームの値は、最後のformの値です。

カレントバッファーにたいしてsymbolがバッファーローカルでなく、自動的にバッファーローカルにマークされない場合、setq-defaultsetqと同じ効果をもちます。カレントバッファーにたいしてsymbolがバッファーローカルな場合、これは他のバッファーから参照できる値を変更します(それらのバッファーがバッファーローカルな値をもたない限り)が、それはカレントバッファーから参照される値ではありません。

;; バッファー‘foo’で行う:
(make-local-variable 'buffer-local)
     ⇒ buffer-local
(setq buffer-local 'value-in-foo)
     ⇒ value-in-foo
(setq-default buffer-local 'new-default)
     ⇒ new-default
buffer-local
     ⇒ value-in-foo
(default-value 'buffer-local)
     ⇒ new-default
;; (新しい)バッファー‘bar’で行う:
buffer-local
     ⇒ new-default
(default-value 'buffer-local)
     ⇒ new-default
(setq buffer-local 'another-default)
     ⇒ another-default
(default-value 'buffer-local)
     ⇒ another-default
;; バッファー‘foo’に戻って行う:
buffer-local
     ⇒ value-in-foo
(default-value 'buffer-local)
     ⇒ another-default
Function: set-default symbol value

この関数はsetq-defaultと似ていますが、symbolは通常の引数として評価されます。

(set-default (car '(a b c)) 23)
     ⇒ 23
(default-value 'a)
     ⇒ 23

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.11 File Local Variables

ファイルにローカル変数の値を指定できます。そのファイルをvisitしているバッファー内で、これらの変数にたいしてバッファーローカルなバインディングを作成するために、Emacsはこれらを使用します。ファイルローカル変数の基本的な情報については、Local Variables in Files in The GNU Emacs Manualを参照してください。このセクションはファイルローカル変数が処理される方法に影響する関数と変数を説明します。

ファイルローカル変数が勝手に関数や、後で呼び出されるLisp式を指定できる場合、ファイルのvisitによりEmacsが乗っ取られてしまうかもしれません。Emacsは、指定された値が安全だと既知のファイルローカル変数だけを自動的にセットすることにより、この危険から保護します。これ以外のファイルローカル変数は、ユーザーが同意した場合のみセットされます。

追加の安全策として、Emacsがファイルローカル変数を読み込むとき、一時的にread-circlenilにバインドされます(Input Functionsを参照してください)。これはLispリーダー循環および共有されたLisp構造(Read Syntax for Circular Objectsを参照してください)を認識することを防ぎます。

User Option: enable-local-variables

この変数はファイルローカル変数を処理するかどうかを制御します。以下の値が利用できます:

t(デフォルト)

安全な変数をセットして、安全でない変数については問い合わせます(1回)。

:safe

安全な変数だけをセットして、問い合わせはしません。

:all

問い合わせをせずに、すべての変数をセットします。

nil

変数をセットしません。

その他

すべての変数にたいして問い合わせます(1回)。

Variable: inhibit-local-variables-regexps

これは正規表現のリストです。ファイルがこのリストの要素にマッチする名前をもつ場合、任意のファイルローカル変数のフォームはスキャンされません。どんなときにこれを使いたいかの例は、See section How Emacs Chooses a Major Modeを参照してください。

Function: hack-local-variables &optional mode-only

この関数は、カレントバッファーの内容により指定された任意のローカル変数として、必要に応じてバインドと評価を行います。変数enable-local-variablesは、ここでも効果をもちます。しかし、この関数は‘-*-行の、‘mode:’ローカル変数を探しません。set-auto-modeはこれを行い、enable-local-variablesも考慮されます(How Emacs Chooses a Major Modeを参照してください)。

この関数は、file-local-variables-alist内に格納されたalistを調べて、各ローカル変数を順に適用することにより機能します。この関数は、変数に適用する前(または後)に、before-hack-local-variables-hook(またはhack-local-variables-hook)を呼び出します。alistが非nilの場合のみ、事前のフック(before-hook)を呼び出し、その他のフックは常に呼び出します。この関数は、そのバッファーがすでにもつメジャーモードと同じメジャーモードが指定された場合には、‘mode’要素を無視します。

オプションの引数mode-onlyが非nilの場合、この関数が行うのはメジャーモードを指定するシンボルをreturnするのがすべてで、‘-*-行またはローカル変数リストがメジャーモードを指定していればそのモード、それ以外はnilをreturnします。この関数はモードや他のファイルローカル変数をセットしません。

Variable: file-local-variables-alist

このバッファーローカルな変数は、ファイルローカル変数のセッティングのalistを保持します。alistの各要素は(var . value)という形式で、varはローカル変数のシンボル、valueはその値です。Emacsがファイルをvisitするとき、最初にすべてのファイルローカル変数をこのalistに収集して、その後に変数1つずつに関数hack-local-variablesを適用します。

Variable: before-hack-local-variables-hook

Emacsは、file-local-variables-alistに格納されたファイルローカル変数を適用する直前に、このフックを呼び出します。

Variable: hack-local-variables-hook

Emacsは、file-local-variables-alistに格納されたファイルローカル変数を適用し終えた直後に、このフックを呼び出します。

ある変数にたいしてsafe-local-variableプロパティーにより、安全な値を指定できます。このプロパティーは引数を1つとる関数です。与えられた値にたいして、その関数が非nilをreturnした場合、その値は安全です。一般的に目にするファイル変数の多くは、safe-local-variableプロパティーをもちます。これらのファイル変数には、fill-columnfill-prefixindent-tabs-modeが含まれます。ブーリーン値の変数にたいしては、プロパティーの値にbooleanpを使用します。

defcustomを使用してユーザーオプションを定義するとき、defcustomに引数:safe functionを追加することにより、safe-local-variableプロパティーをセットできます(Defining Customization Variablesを参照してください)。

User Option: safe-local-variable-values

この変数は、ある変数の値が安全であることをマークする、別の方法を提供します。これはコンスセル(var . val)のリストで、varは変数名、valはその変数にたいして安全な値です。

Emacsが一連のファイルローカル変数にしたがうかどうかユーザーに尋ねるとき、ユーザーはそれらの変数が安全だとマークすることができます。安全だとマークするとsafe-local-variable-valuesにこれらのvariable/valueペアーが追加され、ユーザーのカスタムファイルに保存します。

Function: safe-local-variable-p sym val

この関数は、上記の条件に基づき、symに値valを与えても安全な場合は、非nilをreturnします。

いくつかの変数は危険(risky)だと判断されます。ある変数が危険な場合、その変数が自動的にsafe-local-variable-valuesに追加されることはありません。ユーザーがsafe-local-variable-valuesを直接カスタマイズすることにより、明示的に値を許さない限り、危険な変数をセットする前にEmacsは常に確認を求めます。

名前が非nilrisky-local-variableプロパティーをもつ任意の変数は、危険だと判断されます。defcustomを使用してユーザーオプションを定義するとき、defcustomに引数:risky valueを追加することにより、ユーザーオプションにrisky-local-variableプロパティーをセットできます。それに加えて名前が‘-command’、‘-frame-alist’、‘-function’、‘-functions’、‘-hook’、‘-hooks’、‘-form’、‘-forms’、‘-map’、‘-map-alist’、‘-mode-alist’、‘-program’、‘-predicate’で終わる任意の変数は、自動的に危険だと判断されます。後に数字をともなう変数‘font-lock-keywords’および‘font-lock-keywords’、さらに‘font-lock-syntactic-keywords’も危険だと判断されます。

Function: risky-local-variable-p sym

この関数は、symが上記の条件にもとづき危険な変数の場合は、非非nilをreturnします。

Variable: ignored-local-variables

この変数はファイルによりローカル値を与えられるべきではない変数のリストを保持します。これらの変数に指定された任意の値は、完全に無視されます。

Eval:’“変数”も抜け道になる可能性があるので、Emacsは通常、それを処理する前に確認を求めます。

User Option: enable-local-eval

この変数は‘-*-’行中、またはvisitされるファイル内のローカル変数リストの、‘Eval:’にたいする処理を制御します。値tは、無条件に実行することを意味します。nilは、それらを無視することを意味します。それ以外は、各ファイルにたいして何を行うか、ユーザーに確認を求めることを意味します。デフォルト値は、maybeです。

User Option: safe-local-eval-forms

この変数は、ファイルローカル変数リスト内の‘Eval:’“変数”の中、評価しても安全な式のリストを保持します。

その式が関数呼び出しで、その関数がsafe-local-eval-functionプロパティーをもつ場合、そのプロパティー値はその式の評価が安全かどうかを決定します。プロパティー値は、その式をテストするための述語(predicate)、そのような述語のリスト(成功した述語があれば安全)、またはt(引数が定数である限り常に安全)を指定できます。

テキストプロパティーは、それらの値に関数呼び出しを含めることができるので、抜け道になる可能性があります。したがって、Emacsはファイルローカル変数にたいして指定された文字列値から、テキストプロパティーを取り除きます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.12 Directory Local Variables

ディレクトリーは、そのディレクトリー内のすべてのファイルに共通なローカル変数値を指定することができます。Emacsは、そのディレクトリー内の任意のファイルをvisitしているバッファー内で、それらの変数にたいするバッファーローカルなバインディングを作成するために、これを使用します。これは、そのディレクトリー内のファイルが何らかのプロジェクトに属していて、同じローカル変数を共有するときなどに有用です。

ディレクトリーローカル変数を指定するために、2つの異なる方法があります: 1つは特別なファイルにそれを記述する方法、もう1つはそのディレクトリーにプロジェクトクラス(project class)を定義する方法です。

Constant: dir-locals-file

この定数は、Emacsがディレクトリーローカル変数が見つけることができる期待する、ファイルの名前です。ファイル名は、.dir-locals.el8です。ディレクトリー内でその名前をもつファイルにより、Emacsはディレクトリー内の任意のファイル、または任意のサブディレクトリー(オプションでサブディレクトリーを除外できます。以下を参照してください)にセッティングを適用します。独自に.dir-locals.elをもつサブディレクトリーがある場合、Emacsはサブディレクトリーで見つかった1番深いファイルのディレクトリーからディレクトリーツリーを上方に移動しながら、1番深いファイルのセッティングを使用します。このファイルは、ローカル変数をフォーマットされたリストとして指定します。詳細は、Per-directory Local Variables in The GNU Emacs Manualを参照してください。

Function: hack-dir-local-variables

この関数は.dir-locals.elファイルを読み込み、そのディレクトリー内の任意のファイルをvisitしているバッファーにたいしてローカルなfile-local-variables-alist内に、それらを適用することなくディレクトリーローカル変数を格納します。この関数はディレクトリーローカルなセッティングもdir-locals-class-alist(.dir-locals.elファイルが見つかったディレクトリーにたいする特別なクラスを定義する)内に格納します。この関数は、以下で説明するように、dir-locals-set-class-variablesおよびdir-locals-set-directory-classを呼び出すことにより機能します。

Function: hack-dir-local-variables-non-file-buffer

この関数はディレクトリーローカル変数を探して、即座にそれらをカレントバッファーに適用します。これはDiredバッファーのような、非ファイルバッファーをディレクトリーローカル変数のセッティングにしたがわせるために、モードコマンド呼び出しの中から呼び出されることを意図したものです。非ファイルバッファーにたいしては、Emacsはdefault-directoryと、その親ディレクトリーの中から、ディレクトリーローカル変数を探します。

Function: dir-locals-set-class-variables class variables

この関数は、classという名前がつけられたシンボルにたいして、一連の変数セッティングを定義します。その後このクラスを1つ以上のディレクトリーに割り当てることができ、するとEmacsはこれらの変数セッティングを、それらのディレクトリー内のすべてのファイルに適用します。variables内のリストは、2つの形式 — (major-mode . alist)または(directory . list) — のうち1つをもつことができます。1番目の形式では、そのファイルのバッファーがmajor-modeを継承するモードに切り替わるときに、連想リストalist内のすべての変数が適用されます。alistは、(name . value)という形式です。major-modeにたいする特別な値nilは、そのセッティングが任意のモードに適用できることを意味します。alist内では、特別なnameとして、subdirsを使用することができます。連想値がnilの場合、alistは関連するディレクトリー内のファイルだけに適用され、それらのサブディレクトリーには適用されません。

variablesの2番目の形式では、directoryがそのファイルのディレクトリーの最初のサブディレクトリーの場合、上記のルールにしたがって、listが再帰的に適用されます。listは、この関数のvariablesで指定できる2つの形式のうち、1つを指定します。

Function: dir-locals-set-directory-class directory class &optional mtime

この関数はdirectoryおよびサブディレクトリー内のすべてのファイルにclassを割り当てます。その後、classにたいして指定されたすべての変数セッティングは、directoryおよびその子ディレクトリー内でvisitされた任意のファイルに適用されます。classは事前にdir-locals-set-class-variablesで定義されていなければなりません。

Emacsは、.dir-locals.elファイルからディレクトリー変数をロードするとき、内部的にこの関数を使用します。その場合、オプションの引数mtimeは、ファイルの修正日時(modification time。file-attributesによりreturnされる)を保持します。Emacsは、記憶されたローカル変数がまだ有効化チェックするために、この日時を使用します。ファイルを通じ手ではなく直接クラスを割り当てる場合、この引数はnilになります。

Variable: dir-locals-class-alist

このalistはクラスシンボル(class symbol)と連想変数セッティング(associated variable settings)を保持します。これはdir-locals-set-class-variablesにより更新されます。

Variable: dir-locals-directory-cache

このalistはディレクトリー名、それらに割り当てられたクラス名、およびこのエントリーに関連するディレクトリーローカル変数ファイルの修正日時を保持します。関数dir-locals-set-directory-classは、このlistを更新します。

Variable: enable-dir-local-variables

nilの場合、ディレクトリーローカル変数は無視されます。この変数は、ファイルローカル変数(File Local Variablesを参照してください)にしたがい、ディレクトリーローカル変数は無視したいモードにたいして有用かもしれません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.13 Variable Aliases

シノニムとして2つの変数を作成するのが有用なときがあります。2つの変数は常に同じ値をもち、、どちらか一方を変更すると、もう一方も変更されます。変数の名前を変更 — 古い名前はよく考慮して選択されたものではなかった、あるいは変数の意味が部分的に変更された等の理由で — するとき、互換性のために新しい名前のエイリアス(alias)として古い名前を維持するのが有用なときがあるかもしれません。defvaraliasにより、これを行うことができます。

Function: defvaralias new-alias base-variable &optional docstring

この関数はシンボルbase-variableのエイリアスとして、シンボルnew-aliasを定義します。これはnew-aliasから値を取得すると、base-variableの値がreturnされ、new-aliasの値を変更すると、base-variableの値が変更されることを意味します。エイリアスされた2つの変数名は、常に同じ値と同じバインディングを共有します。

docstring引数が非nilの場合、それはnew-aliasのドキュメント文字列を指定します。それ以外では、エイリアスは(もしあれば)base-variableと同じドキュメント文字列となります。ただし、それはbase-variable自体がエイリアスではない場合で、エイリアスの場合、new-aliasはエイリアスチェーンの最後の変数のドキュメント文字列になります。

この関数はbase-variableをreturnします。

変数のエイリアスは、変数にたいする古い名前を新しい名前に置き換える、便利な方法です。make-obsolete-variableは古い名前を陳腐化(obsolete)していると宣言し。それが将来のある時点で削除されるかもしれないことを宣言します。

Function: make-obsolete-variable obsolete-name current-name when &optional access-type

この関数は、倍とコンパイラーに変数obsolete-nameが陳腐化していると警告させます。current-nameがシンボルの場合、それはこの変数の新たな名前です。その後、obsolete-nameのかわりにcurrent-nameを使用するよう、警告メッセージを伝えます。current-nameが文字列の場合、これはメッセージで、置き換えられる変数はありません。whenは、その変数が最初に陳腐化するのがいつかを示す文字列です(通常はバージョン番号文字列)。

オプションの引数access-typeは、非nilの場合は陳腐化の警告を引き起こすアクセスの種類を指定します。getまたはsetを指定できます。

2つの変数シノニムを作成して、マクロdefine-obsolete-variable-aliasを使用することにより同時に1つが陳腐化していると宣言できます。

Macro: define-obsolete-variable-alias obsolete-name current-name &optional when docstring

このマクロは変数obsolete-nameが陳腐化しているとマークして、それを変数current-nameにたいするエイリアスにします。これは以下と等価です:

(defvaralias obsolete-name current-name docstring)
(make-obsolete-variable obsolete-name current-name when)
Function: indirect-variable variable

この関数は、variableのエイリアスチェーンの最後の変数をreturnします。variableがシンボルでない場合、またはvariableがエイリアスとして定義されていない場合、この関数はvariableをreturnします。

この関数は、シンボルのチェーンがループしているときは、cyclic-variable-indirectionエラーをシグナルします。

(defvaralias 'foo 'bar)
(indirect-variable 'foo)
     ⇒ bar
(indirect-variable 'bar)
     ⇒ bar
(setq bar 2)
bar
     ⇒ 2
foo
     ⇒ 2
(setq foo 0)
bar
     ⇒ 0
foo
     ⇒ 0

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.14 Variables with Restricted Values

通常のLisp変数には、有効なLispオブジェクトである任意の値を割り当てることができます。しかし、LispではなくCで定義されたLisp変数もあります。これらの変数のほとんどは、DEFVAR_LISPを使用してCコードで定義されています。Lispで定義された変数と同様、これらは任意の値をとることができます。しかし、いくつかの変数はDEFVAR_INTDEFVAR_BOOLを使用して定義されています。C実装の概要的な議論は、Writing Emacs Primitives、特にタイプsyms_of_filenameの関数の説明を参照してください。

タイプがDEFVAR_BOOLの変数は、値にniltしかとることができません。他の値の割り当てを試みると、tはセットされます:

(let ((display-hourglass 5))
  display-hourglass)
     ⇒ t
Variable: byte-boolean-vars

この変数は、タイプDEFVAR_BOOLのすべての変数のリストを保持します。

タイプがDEFVAR_INTの変数は、整数値だけをとることができます。他の値の割り当てを試みると、結果はエラーになります:

(setq undo-limit 1000.0)
error→ Wrong type argument: integerp, 1000.0

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.15 Generalized Variables

ジェネリック変数(generalized variable: 汎変数)またはplace formは、値が格納されるLispメモリー内の多くの場所のうちの1つです。1番シンプルなplace formは、通常のLisp変数です。しかし、リストのCARCDR、配列の要素、シンボルのプロパティー、その他多くのロケーション(location)も、Lisp値が格納される場所です。

ジェネリック変数は、C言語の“lvalues(左辺値)”と類似しています。C言語のlvalueでは、‘x = a[i]’で配列から要素を取得し、同じ表記を使用して、‘a[i] = x’で要素を格納します。a[i]のような特定のフォームが、Cではlvalueになれるように、Lispでジェネリック変数になることができる一連のフォームが存在します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.15.1 The setf Macro

setfマクロは、ジェネリック変数を操作する、もっとも基本的な方法です。setfフォームはsetqと似ていますが、シンボルだけでなく、左辺の任意のplace formを受け入れます。たとえば(setf (car a) b)aのcarをbにセットして、(setcar a b)と同じ操作を行いますが、すべてのplaceのタイプにセットおよびアクセスするために2つの別個の関数を覚える必要はありません。

Macro: setf [place form]…

このマクロはformを評価して、それをplaceに格納します。placeは有効なジェネリック変数フォームでなければなりません。複数のplace/formペアーがある場合、割り当てはsetqのときと同様です。setfは最後のformの値をreturnします。

以下のLispフォームはジェネリック変数として機能するので、setfplace引数にすることができます:

どのように処理すれば良いか知られていないplaceフォームを渡した場合、setfはエラーをシグナルします。

nthcdrの場合、関数のリスト引数は、それ自体が有効なplaceフォームでなければならないことに注意してください。たとえば、(setf (nthcdr 0 foo) 7)は、foo自体に7をセットするでしょう。

マクロpush(Modifying List Variablesを参照してください)、およびpop(Accessing Elements of Listsを参照してください)は、リストだけでなくジェネリック変数を操作できます。(pop place)は、place内に格納されたリストの最初の要素を削除してreturnします。これは(prog1 (car place) (setf place (cdr place)))と類似していますが、すべてのサブフォームを1度だけ評価します。(push x place)は、place内に格納されたリストの1番前に、xを挿入します。これは(setf place (cons x place))と類似していますが、サブフォームの評価を除きます。nthcdr placeへのpushおよびpopは、リスト内の任意の位置での挿入および削除に使用できることに注意してください。

cl-libライブラリーは、追加のsetf placeを含む、ジェネリック変数ニタイスルサマザマナ拡張を定義します。Generalized Variables in Common Lisp Extensionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.15.2 Defining new setf forms

このセクションでは、setfが操作できる新たなフォームを定義する方法を説明します。

Macro: gv-define-simple-setter name setter &optional fix-return

このマクロは、単純なケースにたいしてsetfメソッドを簡単に定義することを可能にします。nameは、関数、マクロ、スペシャルフォームの名前です。nameが、それを更新するための対応するsetter関数をもつときは、このマクロを使用できます(たとえば(gv-define-simple-setter car setcar))。

このマクロをフォーム以下の呼び出しを

(setf (name args…) value)

以下のように変換します。

(setter argsvalue)

setfのような呼び出しは、valueをreturnするようにドキュメントされます。これに問題はありません。たとえばcarsetcarでは、setcarはそれがセットする値をreturnするからです。setter関数がvalueをreturnしない場合は、gv-define-simple-setterfix-return引数に、非nil値を使用してください。これは以下のようなものに展開されます

(let ((temp value))
  (setter args… temp)
  temp)

これで正しい結果がreturnされることが保証されます。

Macro: gv-define-setter name arglist &rest body

このマクロは、上述のフォームより複雑なsetf展開を可能にします。たとえば、呼び出すべきシンプルなsetter関数が存在しないときや、もしそれが存在してもplace formとは異なる引数を要求する場合には、このフォームを使う必要があるかもしれません。

このマクロは最初にsetf引数フォーム(value args…)arglistにバインドして、その後bodyを実行することにより、フォーム(setf (name args…) value)を展開します。bodyは割り当てを行うLispフォームをreturnし、最後にセットされた値をreturnするべきです。以下はこのマクロの使用例です:

(gv-define-setter caar (val x) `(setcar (car ,x) ,val))

展開をさらに制御するには、マクロgv-define-expanderを参照してください。マクロgv-letplaceは、setfのように処理を行うマクロを定義するのに有用です。詳細は、gv.elのソースファイルを参照してください。

Common Lispに関する注意: Common Lispは関数のsetf、すなわち“setf関数”の挙動を指定するための別の方法を定義します。setf関数の名前はシンボルではなく。リスト(setf name)です。たとえば(defun (setf foo) …)は、setffooに適用されるときに使用される関数を定義します。Emacsはこれをサポートしません。適切な展開が定義されていないフォームにsetfを使用すると、コンパイル時にエラーとなります。Common Lispでは、関数(setf func)が後で定義されるので、エラーにはなりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12 Functions

Lispプログラムは主にLisp関数で構成されます。このチャプターは、関数とは何か、引数を受け取る方法、関数を定義する方法を説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.1 What Is a Function?

一般的な意味では、関数とは引数(arguments)と呼ばれる与えられた入力値の計算を担うルールです。計算の結果は、その関数の値(value)、またはreturn値(return value)と呼ばれます。計算は、変数の値やデータ構造の内容を変更する等の副作用をもつこともできます。

ほとんどのコンピューター言語では、関数はそれぞれ名前をもちます。しかしLispでは、厳密な意味において、関数は名前をもちません。関数はオブジェクトであり、関数の名前の役割を果たすシンボルに関連づけることができますが(たとえばcar)、それはオプションです。Naming a Functionを参照してください。関数が名前を与えられたとき、通常はそのシンボルを“関数”として参照します(たとえば、関数carのように参照します)。このマニュアルでは、関数名と関数オブジェクト自身との間の区別は、通常は重要ではありませんが、それが意味をもつような場合は注記します。

スペシャルフォーム(special form)マクロ(macro)と呼ばれる、関数likeなオブジェクトがいくつかあり、それらも引数を受け受け、計算を担います。しかし以下で説明するように、Emacs Lispではこれらは関数とは考えられません。

以下は関数および関数likeなオブジェクトにたいする、重要な条件です:

lambda expression

Lispで記述された関数(厳密には関数オブジェクト)です。これらについては、以降のセクションで説明します。 Lambda Expressionsを参照してください。

primitive

Lispから呼び出すことができますが、実際にはCで記述されています。プリミティブは、ビルトイン関数(built-in functions)や、サブルーチン(subr)といった呼ばれかたもします。それらの例には関数likeなcarappendが含まれます。加えて、すべてのスペシャルフォーム(以下参照)もプリミティブと考えられます。

関数はLispの基礎となる部分(たとえばcar)であり、オペレーティングシステムのサービスにたいして値レベルのインターフェースを与え、高速に実行される必要があるため、通常はプリミティブとして実装されています。Lispで定義された関数とは異なり、プリミティブの修正や追加には、Cソースの変更とEmacsのリコンパイルが必要です。Writing Emacs Primitivesを参照してください。

special form

プリミティブは関数と似ていますが、すべての引数が通常の方法で評価はされません。いくつかの引数だけが評価されるかもしれず、通常ではない順序で、複数回評価されるかもしれません。プリミティブの例には、ifandwhileが含まれます。Special Formsを参照してください。

macro

あるLisp式を、オリジナルの式のかわりに評価される別の式に変換する、関数とは別のLispで定義された構造です。マクロは、スペシャルフォームが行う一連のことを、Lispプログラマーが行うのを可能にします。Macrosを参照してください。

command

command-executeプリミティブを通じて呼び出すことができるオブジェクトで、通常はそのコマンドにバインドされたキーシーケンスを、ユーザーがタイプすることにより呼び出されます。Interactive Callを参照してください。コマンドは通常、関数です。その関数がLispで記述されている場合は、関数の定義内のinteractiveフォームによりコマンドとなります(Defining Commandsを参照してください)。関数であるコマンドは、他の関数と同様、Lisp式から呼び出すこともできます。

キーボードマクロ(文字列およびベクター)は関数ではありませんが、これらもコマンドです。Keyboard Macrosを参照してください。シンボルの関数セルにコマンドが含まれている場合、わたしたちはそのシンボルをコマンドと言います(Symbol Componentsを参照してください)。そのような名前つきコマンド(named command)は、M-xで呼び出すことができます。

closure

ラムダ式とよく似た関数オブジェクトですが、クロージャーはレキシカル変数バインディングの“環境”にも囲まれています。Closuresを参照してください。

byte-code function

バイトコンパイラーによりコンパイルされた関数です。Byte-Code Function Typeを参照してください。

autoload object

実際の関数のプレースホルダーです。autoloadオブジェクトが呼び出された場合、Emacsは実際の関数の定義を含むファイルをロードした後、実際の関数を呼び出します。Autoloadを参照してください。

関数functionpを使用して、あるオブジェクトが関数かどうかテストできます:

Function: functionp object

この関数はobjectが任意の種類の関数(たとえばfuncallに渡すことができる)の場合は、tをreturnします。functionpは関数を名づけるシンボルにたいしてはt、スペシャルフォームにたいしてはnilをreturnすることに注意してください。

functionpとは異なり、以下の3つの関数は、シンボルをそれの関数定義としては扱いません

Function: subrp object

この関数は、objectがビルトイン関数(たとえばLispプリミティブ)の場合は、tをreturnします。

(subrp 'message)            ; messageはシンボルであり、
     ⇒ nil                 ;   subrオブジェクトではない。
(subrp (symbol-function 'message))
     ⇒ t
Function: byte-code-function-p object

この関数は、objectがバイトコード関数の場合は、tをreturnします。たとえば:

(byte-code-function-p (symbol-function 'next-line))
     ⇒ t
Function: subr-arity subr

この関数はプリミティブsubrの引数リストについての情報を提供します。retrun値は、(min . max)というペアーです。minは引数の最小数です。maxは最大数、または引数&restを伴う関数にたいしてはシンボルmanysubrがスペシャルフォームの場合はシンボルunevalledです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2 Lambda Expressions

ラムダ式(lambda expression)は、Lispで記述された関数オブジェクトです。以下は例です:

(lambda (x)
  "Xの双曲線コサインをreturnする。"
  (* 0.5 (+ (exp x) (exp (- x)))))

Emacs Lispでは、このようなリストは、関数オブジェクトに評価される、有効な式です。

ラムダ式自身は名前をもたない、無名関数(anonymous function)です。ラムダ式をこの方法で使用できますが(Anonymous Functionsを参照してください)、名前付き関数(named functions)を作成するためにシンボルに関連付けられる方が一般的です(see section Naming a Function)。これらの詳細に触れる前に、以下のサブセクションではラムダ式の構成要素と、それらが行うことについて説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.1 Components of a Lambda Expression

ラムダ式は、以下のようなリストです:

(lambda (arg-variables…)
  [documentation-string]
  [interactive-declaration]
  body-forms…)

ラムダ式の1番目の要素は常にシンボルlambdaです。これは、そのリストが関数を表すことを示します。lambdaで関数定義を開始する理由は、他の目的のたまえの使用が意図された他のリストが、意図せず関数として評価されないようにするためです。

2番目の要素は、シンボル — 引数変数名のリストです。これはラムダリスト(lambda list)と呼ばれます。Lisp関数が呼び出されたとき、引数値はラムダリスト内の変数と対応付けされます。ラムダリストは、与えられた値にたいするローカルバインディングが付与されます。Local Variablesを参照してください。

ドキュメント文字列(documentation string)はEmacs Lispのヘルプ機能にたいしてその、関数を説明する、関数定義に配されたLisp文字列オブジェクトです。Documentation Strings of Functionsを参照してください。

インタラクティブ宣言(interactive declaration)は、(interactive code-string)という形式のリストです。これは、この関数が対話的に使用された場合に引数を提供する方法を宣言します。この宣言をもつ関数は、コマンド(command)と呼ばれます。コマンドはM-xを使用したり、キーにバインドして呼び出すことができます。この方法で呼び出されることを意図しない関数は、インタラクティブ宣言を持つべきではありません。インタラクティブ定義を記述する方法は、See section Defining Commandsを参照してください。

残りの要素は、その関数のbody(本体) — その関数が処理を行うためのLispコード(Lispプログラマーは“評価されるLispフォームのリスト”と言うでしょう)です。この関数からreturnされる値は、bodyの最後の要素によりreturnされる値です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.2 A Simple Lambda Expression Example

以下の例を考えてみてください:

(lambda (a b c) (+ a b c))

以下のように、funcallに渡すことにより、この関数を呼び出すことができます:

(funcall (lambda (a b c) (+ a b c))
         1 2 3)

この呼び出しは、変数aに1、bに2、cに3をバインドして、ラムダ式のbodyを評価します。bodyの評価により、これら3つの数が加算されて、6が結果として生成されます。したがってこの関数呼び出しにより、6がreturnされます。

以下のように、引数は他の関数の結果であってもよいことに注意してください:

(funcall (lambda (a b c) (+ a b c))
         1 (* 2 3) (- 5 4))

これは引数1(* 2 3)(- 5 4)を左から右に評価します。その後、ラムダ式に引数1、6、1を適用して、値8が生成されます。

これらの例が示すように、ローカル変数を作成して、それらに値を与えるフォームとして、CARがラムダ式であるようなフォームを使用することができます。古い時代のLispでは、この方法がローカル変数をバインドして初期化する唯一の方法でした。しかし現在では、この目的にはフォームletを使用するほうが明解です(Local Variablesを参照してください)。ラムダ式は主に、他の関数の引数として渡される無名関数(Anonymous Functionsを参照してください)として、あるいは名前つき関数(Naming a Functionを参照してください)を生成するためにシンボルの関数定義に格納するために使用されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.3 Other Features of Argument Lists

シンプルなサンプル関数(lambda (a b c) (+ a b c))は、3つの引数変数を指定しているので、3つの引数で呼び出されなければなりません。引数を2つしか指定しなかったり4つ指定した場合は、wrong-number-of-argumentsエラーとなります。

特定の引数を省略できる関数を記述できると便利なこともあります。たとえば関数substringは3つの引数 — 文字列、開始インデックス、終了インデックス — を受け取りますが、3つ目の引数を省略した場合、デフォルトでその文字列のlengthとなります。関数list+が行うように、特定の関数にたいして不定個の引数を指定できると便利なときもあります。

関数が呼び出されるとき省略されるかもしれないオプションの引数を指定するには、オプションの引数の前にキーワード&optionalを含めるだけです。0個以上の追加引数のリストを指定するには、最後の引数の前にキーワード&restを含めます。

したがって、引数リストの完全な構文は以下のようになります:

(required-vars[&optional optional-vars]
 [&rest rest-var])

角カッコ(square bracket)は、&optional&rest、およびそれらに続く変数が省略できることを示します。

この関数の呼び出しには、required-varsのそれぞれにたいして、実際の引数が要求されます。0個以上のoptional-varsにたいして実際の引数があるかもしれませんが、ラムダ式が&restを使用していなければ、その個数を超えて実際の引数を記述することはできません。&restが記述されている場合、追加で任意個の実際の引数があるかもしれません。

optionaやrest変数にたいして実際の引数が省略された場合、それらのデフォルトは常にnilになります。関数にたいして引数に明示的にnilが使用されたのか、引数が省略されたのかを区別することはできません。しかし関数のbodyが、nilを他の有意な値が省略されたと判断することは自由です。これはsubstringが行っていることです。substringの3つ目の引数がnilの場合、それは文字列の長さを使用することを意味します。

Common Lispに関する注意: Common Lispでは、オプションの引数が省略されたときに使用するデフォルト値を指定できます。Emacs Lispは、引数が明示的に渡されたかを調べる、“supplied-p”変数はサポートしません。

例えば、引数リストは以下のようになります:

(a b &optional c d &rest e)

これはabは最初の2つの実引数となり、これらは必須です。さらに1つまたは2つの引数が指定された場合、それらは順番にcdにバインドされます。1つ目から4つ目の引数の後の引数は、リストにまとめられて、eにそのリストがバインドされます。2つしか引数が指定されなかった場合、cnilになります。2つまたは3つの引数の場合、dnilです。引数が4つ以下の場合、enilになります。

オプションの引数の後ろに必須の引数を指定する方法はありません — これは意味を成さないからです。なぜそうなるかは、この例でcがオプションでdが必須な場合を考えてみてください。実際に3つの引数が与えられたとします。3番めの引数は何を指定したのでしょうか? この引数はcなのでしょうか、それともdに使用されるのでしょうか? 両方の場合が考えられます。同様に、&rest引数の後に、さらに引数(必須またはオプション)をもつことも意味を成しません。

以下に引数リストと、それを正しく呼び出す例をいくつか示します:

(funcall (lambda (n) (1+ n))        ; 1つの必須:
         1)                         ; これは正確に1つの引数を要求する。
     ⇒ 2
(funcall (lambda (n &optional n1)   ; 1つは必須で、1つはオプション:
           (if n1 (+ n n1) (1+ n))) ; 1つまたは2つの引数。
         1 2)
     ⇒ 3
(funcall (lambda (n &rest ns)       ; 1つは必須で、後は残り:
           (+ n (apply '+ ns)))     ; 1つ以上の引数。
         1 2 3 4 5)
     ⇒ 15

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.4 Documentation Strings of Functions

ラムダ式は、ラムダリストの食後に、オプションでドキュメント文字列(documentation string)をもつことができます。この文字列は、その関数の実行に影響を与えません。これはコメントの一種ですが、Lisp機構に内在するシステム化されたコメントであり。Emacsのヘルプ機能で使用できます。ドキュメント文字列にアクセスする方法は、Documentationを参照してください。

たとえその関数があなたのプログラム内だけで呼び出される関数だとしても、すべての関数にドキュメント文字列を与えるのはよいアイデアです。ドキュメント文字列はコメントと似ていますが、コメントより簡単にアクセスできます。

ドキュメント文字列の1行目は、関数自体にもとづくものであるべきです。なぜならaproposは、最初の1行目だけを表示するからです。ドキュメント文字列の1行目は、その関数の目的を要約する、1つまたは2つの完全なセンテンスで構成されるべきです。

ドキュメント文字列の開始は通常、ソースファイル内ではインデントされていますが、ドキュメント文字列の開始のダブルクォート文字の前にインデントのスペースがあるので、インデントはドキュメント文字列の一部にはなりません。ドキュメント文字列の残りの行がプログラムソース内で揃うようにインデントする人がいます。これは、間違いです。後続の行のインデントは文字列の内部にあります。これはソースコード内での見栄えはよくなりますが、ヘルプコマンドで表示したとき見栄えが悪くなります。

ドキュメント文字列がなぜオプションになるのか不思議に思うかもしれません。なぜなら、ドキュメント文字列の後には必須となる関数の構成要素であるbodyが続くからです。文字列を評価するとその文字列自身がれつrnされるので、それがbody内の最後のフォームでない限りなんの効果もありません。したがって、実際はbodyの1行目とドキュメント文字列で混乱が生じることはありません。bodyの唯一のフォームが文字列の場合、それはreturn値とドキュメントの両方の役目を果たします。

ドキュメント文字列の最後の行には、実際の関数引数とは異なる呼び出し規約を指定できます。これは以下のようなテキストを記述します

\(fn arglist)

ただし、このテキストの前に空行があり、テキスト自身が行頭から記述されていて、ドキュメント文字列内でこのテキストの後に改行が続かない場合です(‘\’はEmacsの移動コマンドが混乱するのを避けるために使用されます)。この方法で指定された呼び出し規約は、ヘルプメッセージ内で関数の実引数から生成される呼び出し例と同じ場所に表示されます。

マクロ定義内に記述された引数は、ユーザーがマクロ呼び出しの一部だと考える方法と合致しない場合がしばしばあるので、この機能はマクロ定義で特に有用です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.3 Naming a Function

シンボルは関数の名前となることができます。これは、そのシンボルの関数セル(function cell: Symbol Componentsを参照してください)が、関数オブジェクト(たとえばラムダ式)を含むときに起こります。するとそのシンボル自身が呼び出し可能な有効な関数、つまりそのシンボルの関数セルの関数と等価になります。

関数セルの内容は、そのシンボルの関数定義(function definition)と呼ぶこともできます。そのシンボルのかわりに、シンボルの関数定義を使う手続きのことをシンボル関数インダイレクション(symbol function indirection)と呼びます。Symbol Function Indirectionを参照してください。与えられたシンボルに関数定義がない場合、シンボルの関数セルはvoidと呼ばれ、それを関数として使用することはできません。

実際のところ、ほとんどすべての関数は名前をもち、その名前により参照されます。ラムダ式を定義することにより名前つきのLisp関数を作成、それを関数セル(Accessing Function Cell Contentsを参照してください)に置くことができます。しかし、さらに一般的なのはdefunスペシャルフォーム(次のセクションで説明します)を使う方法です。 Defining Functionsを参照してください。

わたしたちは関数名を与えるのは、Lisp式内で関数を名前で参照するのが便利だからです。また、名前つきの関数は簡単に自分自身を —再帰的(recursive)に参照することができます。さらに、プリミティブはテキスト的な名前だけで参照することができます。なぜならプリミティブ関数は入力構文(read syntax)をもたないオブジェクトだからです(Primitive Function Typeを参照してください)。

関数は一意な名前をもつ必要はありません。与えられた関数オブジェクトは、通常は1つのシンボルの関数セルだけに存在しますが、これは単に慣習的なものです。fsetを使用して、関数を複数のシンボルに格納するのは簡単です。それらのシンボルはそれぞれ、同じ関数にたいする有効な名前となります。

関数として使用されているシンボルを、変数としても利用できることに注意してください。シンボルのこれら2つの利用法は独立しており、競合はしません(これはSchemaのような他のいくつかのLisp方言には当てはまりません)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.4 Defining Functions

わたしたちは通常、関数を最初に作成したときに名前を与えます。これは関数の定義(defining a function)と呼ばれ、defunマクロにより行われます。

Macro: defun name args [doc] [declare] [interactive] body…

defunは新たなLisp関数を定義する通常の方法です。これは、引数リストargs、およびbodyにより与えられるbodyフォームとともに、シンボルnameを関数として定義します。nameargsを、クォートする必要はありません。

docが与えられた場合、それはその関数のドキュメント文字列を指定する文字列であるべきです(Documentation Strings of Functionsを参照してください)。declareが与えられた場合、それは関数のメタデータを指定する、declareフォームであるべきです(The declare Formを参照してください)。interactiveが与えられた場合、それは関数が対話的に呼び出される方法を指定するinteractiveフォームであるべきです(Interactive Callを参照してください)。

defunのreturn値は定義されていません。

以下にいくつか例を示します:

(defun foo () 5)
(foo)
     ⇒ 5
(defun bar (a &optional b &rest c)
    (list a b c))
(bar 1 2 3 4 5)
     ⇒ (1 2 (3 4 5))
(bar 1)
     ⇒ (1 nil nil)
(bar)
error→ Wrong number of arguments.
(defun capitalize-backwards ()
  "Upcase the last letter of the word at point."
  (interactive)
  (backward-word 1)
  (forward-word 1)
  (backward-char 1)
  (capitalize-word 1))

意図せず既存の関数を再定義しないように、注意してください。defuncarのようなプリミティブ関数でさえ、躊躇なく問い合わせもなしに再定義します。Emacsががががこれを妨げることはありません。なぜなら関数の再定義は故意に行われることがあり、そのような意図した再定義を、意図しない再定義と見分ける方法はないからです。

Function: defalias name definition &optional doc

この関数は、定義definition(任意の有効なLisp関数)とともに、シンボルnameを関数として定義します。この関数のreturn値は未定義です。

docが非nilの場合、それは関数nameのドキュメントになります。それ以外は、definitionにより提供されるドキュメントが使用されます。

内部的には、defaliasは通常、定義のセットにfsetを使用します。しかしnamedefalias-fset-functionプロパティーをもつ場合、fsetを呼び出すかわりに、それに割り当てられた値が使用されます。

defaliasを使う正しい場所は、特定の関数名がまさに定義される場所 — 特にソースファイルがロードされるとき明示的にその名前が出現する場所です。これはdefaliasが、defunと同じように、どれが関数を定義するファイルなのか記録するからです(Unloadingを参照してください)。

それとは対象的に、他の目的のために関数を操作するプログラムでは、そのような記録を保持しないfsetを使用するほうがよいでしょう。Accessing Function Cell Contentsを参照してください。

defundefaliasで新たなプリミティブ関数を作成することはできませんが、任意の関数定義を変更するのに使用することができ、通常の定義がプリミティブであるcarx-popup-menuのような関数でさえ変更することができます。しかし、これは危険なことです。たとえば、Lispの完全性を損なうことなく、carを再定義するのはほとんど不可能だからです。それほど有名ではないx-popup-menuのような関数の再定義では、危険は減るものの、それでも期待したとおりに機能しないかもしれません。Cコードにこのプリミティブの呼び出しがある場合、それは直接そのプリミティブのC定義を呼び出すので、シンボル定義を変更しても、それらに影響はありません。

defsubstも参照してください。これはdefunのように関数を定義して、それのインライン展開を処理するようLispコンパイラーに指示します。Inline Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.5 Calling Functions

関数を定義しただけでは、半分しか終わっていません。関数はそれを呼び出す(call) — たとえば実行(run)するまでは、何も行いません。関数のcallは、invocationとしても知られています。

関数を呼び出すもっとも一般的な方法は、リストの評価による方法です。たとえば、リスト(concat "a" "b")を評価することにより、関数concatが引数"a""b"で呼び出されます。評価については、Evaluationを参照してください。

プログラム内で式としてリストを記述するときは、プログラム内にテキストで、どの関数を呼び出すか、いくつの引数を与えるかを指定します。通常は、これが行いたいことです。どの関数を呼び出すかを、実行時に計算する必要がある場合もあります。これを行うには、関数funcallを使用します。実行時にいくつの引数を渡すか決定する必要があるときは、applyを使用します。

Function: funcall function &rest arguments

funcallは、関数functionを引数argumentsで呼び出し、functionがreturnした値をreturnします。

funcallは関数なので、functionを含むすべての引数は、funcallの呼び出し前に評価されます。これは、呼び出される関数を得るための任意の式を使用できることを意味します。これはまた、funcallargumentsに記述した式ではなく、その値だけを見ることを意味します。これらの値はfunction呼び出し中では、2回目は評価されませんfuncallの処理は、関数の通常の呼び出し手続きと似ており、すでに評価された引数は評価されません。

引数functionは、Lisp関数、またはプリミティブ関数でなければなりません。つまりスペシャルフォームやマクロは、“評価されていない”引数式を与えられたときだけ意味があるので、指定することはできません。上述したように、funcallは最初に指定された評価前の引数を提供することはできません。

(setq f 'list)
     ⇒ list
(funcall f 'x 'y 'z)
     ⇒ (x y z)
(funcall f 'x 'y '(z))
     ⇒ (x y (z))
(funcall 'and t nil)
error→ Invalid function: #<subr and>

これらの例を、applyの例と比較してみてください。

Function: apply function &rest arguments

applyは、関数functionを引数argumentsで呼び出します。これはfuncallと同様ですが、1つ違いがあります。argumentsの最後はオブジェクトのリストです。これは1つのリストではなく、個別の引数としてfunctionに渡されます。わたしたちはこれを、applyがこのリストを展開(spread)(個々の要素が引数となるので)する、と言います。

applyは、functionを呼び出した結果をreturnします。funcallと同様、functionはLisp関数かプリミティブ関数でなければなりません。つまりスペシャルフォームやマクロは、applyでは意味をもちません。

(setq f 'list)
     ⇒ list
(apply f 'x 'y 'z)
error→ Wrong type argument: listp, z
(apply '+ 1 2 '(3 4))
     ⇒ 10
(apply '+ '(1 2 3 4))
     ⇒ 10
(apply 'append '((a b c) nil (x y z) nil))
     ⇒ (a b c x y z)

applyを使用した興味深い例は、Definition of mapcarを参照してください。

ある関数にたいして、その関数のある引数を特定の値に固定し、他の引数は実際に呼びだされたときの値にできれば便利なことがあります。関数のいくつかの引数を固定することは、その関数の部分適用(partial application)と呼ばれます9。結果は、残りの引数をとる新たな関数で、すべての引数を合わせて元の関数を呼び出します。

Emacs Lispで部分適用を行う方法を示します:

Function: apply-partially func &rest args

この関数は、新たな関数をreturnします。この新しい関数は、呼びだされたときにargsと、呼び出し時に指定された追加の引数から成る引数リストでfuncを呼び出す関数です。funcn個の引数を指定できる場合、m < n個の引数でapply-partiallyを呼び出すと、n - m個の新たな関数を生成します。

以下は、apply-partiallyと他のビルトイン関数+,を使用して、(もし存在しないなら)ビルトイン関数1+を定義する例です:

(defalias '1+ (apply-partially '+ 1)
  "Increment argument by one.")
(1+ 10)
     ⇒ 11

引数として関数をとったり、データ構造(特にフック変数やプロパティーリスト)から関数を探す関数はLispでは一般的で、それらはfuncallapplyを使用してそれらの関数を呼び出します。引数として関数をとる関数は、ファンクショナル(functional)と呼ばれるときもあります。

ファンクショナルを呼び出すとき、引数としてno-op関数(何も行わない関数)を指定できると便利なときがあります。以下に2つの異なるno-op関数を示します:

Function: identity arg

この関数はargをreturnします。副作用はありません。

Function: ignore &rest args

この関数は任意の引数を無視して、nilをreturnします。

いくつかの関数はユーザーに可視なコマンドで、これらは(通常はキーシーケンスを介して)対話的に呼び出すことができます。そのようなコマンドは、call-interactively関数を使用することにより、対話的に呼びだされたときと同様に呼び出すことができます。Interactive Callを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.6 Mapping Functions

マップ関数(mapping function)は与えられた関数(スペシャルフォームやマクロではない)を、リストや他のコレクションの各要素に適用します。Emacs Lispにはそのような関数がいくつかあります。このセクションでは、リストにたいしてマッピングを行うmapcarmapcmapconcatを説明します。obarray内のシンボルにたいしてマッピングを行う関数mapatomsは、Definition of mapatomsを参照してください。ハッシュテーブル内のkey/value関係にたいしてマッピングを行う関数maphashは、Definition of maphashを参照してください。

これらのマップ関数は、文字テーブル(char-table)には適用されません。なぜなら文字テーブルは非常に広い範囲の疎な配列だからです。疎な配列であるという性質に適う方法で文字いテーブルにマッピングするには、関数map-char-tableを使用します(Char-Tablesを参照してください)。

Function: mapcar function sequence

mapcarは、関数functionsequenceの各要素にたいして順番に適用し、その結果をリストでreturnします。

引数sequenceには、文字テーブルを除く任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できます。結果は常にリストになります。結果の長さは、sequenceの長さと同じです。たとえば:

(mapcar 'car '((a b) (c d) (e f)))
     ⇒ (a c e)
(mapcar '1+ [1 2 3])
     ⇒ (2 3 4)
(mapcar 'string "abc")
     ⇒ ("a" "b" "c")
;; my-hooks内の各関数を呼び出す。
(mapcar 'funcall my-hooks)
(defun mapcar* (function &rest args)
  "Apply FUNCTION to successive cars of all ARGS.
Return the list of results."
  ;; リストが消費されていなければ、
  (if (not (memq nil args))
      ;; CARに関数を適用する。
      (cons (apply function (mapcar 'car args))
            (apply 'mapcar* function
                   ;; 残りの要素のための再帰。
                   (mapcar 'cdr args)))))
(mapcar* 'cons '(a b c) '(1 2 3 4))
     ⇒ ((a . 1) (b . 2) (c . 3))
Function: mapc function sequence

mapcmapcarと似ていますが、functionは副作用のためだけに使用されます — つまりfunctionがreturnする値は無視され、リストに収集されません。mapcは常にsequenceをreturnします。

Function: mapconcat function sequence separator

mapconcatは関数functionsequenceの各要素に適用します。結果は結合された文字列になります。結果文字列の間に、mapconcatは文字列separatorを挿入します。separatorには通常、スペースやカンマ、あるいはその他の適切な区切り文字が含まれます。

引数functionはははは、1つの引数を取り文字列をreturnする関数でなければなりません。引数sequenceには、文字テーブルを除く、任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できます。

(mapconcat 'symbol-name
           '(The cat in the hat)
           " ")
     ⇒ "The cat in the hat"
(mapconcat (function (lambda (x) (format "%c" (1+ x))))
           "HAL-8000"
           "")
     ⇒ "IBM.9111"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.7 Anonymous Functions

関数は通常、defunにより定義され、同時に名前が与えられますが、明示的にラムダ式を使う — 無名関数(anonymous function)のほうが便利なときもあります。無名関数は、名前つき関数が有効な場所なら、どこでも有効です。無名関数は変数や関数の引数に割り当てられることがよくあります。たとえば、ある関数をリストの各要素に適用するmapcarfunction引数に渡すかもしれません(Mapping Functionsを参照してください)。現実的な例は、describe-symbols exampleを参照してください。

無名関数として使用するためのラムダ式を定義するとき、原則的にはリストを構築する任意の手法を使用できます。しかし通常は、マクロlambda、スペシャルフォームfunction、または入力構文#'を使用するべきです。

Macro: lambda args [doc] [interactive] body…

このマクロは引数リストargs、(もしあれば)ドキュメント文字列doc、(もしあれば)インタラクティブ指定interactive、およびbodyで与えられるbodyフォームをもつ無名関数をreturnします。

実際にはこのマクロはlambdaフォームを“自己クォート(self-quoting)”します。つまりCARlambdaであるようなフォームは、そのフォーム自身を得ます。

(lambda (x) (* x x))
     ⇒ (lambda (x) (* x x))

lambdaフォームは別に、1つの効果をもちます。このマクロは、function(以下参照)をサブルーチンとして使用することにより、Emacs評価機能(Emacs evaluator)とバイトコンパイラーに、その引数が関数であることを告げます。

Special Form: function function-object

このスペシャルフォームは、評価を行わずに、function-objectをreturnします。この点では、quote(Quotingを参照してください)と似ています。しかしquoteとは異なり、Emacs評価機能とバイトコンパイラーに、これを関数として使用する意図を告げる役割をもちます。function-objectが有効なラムダ式と仮定すると、これは2つの効果をもちます:

入力構文#'は、functionの使用の略記です。以下のフォームは等価です:

(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))

以下の例では、3つ目の引数に関数をとる、change-property関数を定義し、その後のchange-propertyで、無名関数を渡してこれを使用しています:

(defun change-property (symbol prop function)
  (let ((value (get symbol prop)))
    (put symbol prop (funcall function value))))
(defun double-property (symbol prop)
  (change-property symbol prop (lambda (x) (* 2 x))))

lambdaフォームをクォートしていないことに注意してください。

上記のコードをコンパイルした場合は、無名関数もコンパイルされます。リストをクォートすることにより無名関数を構築した場合、コンパイルはされません。

(defun double-property (symbol prop)
  (change-property symbol prop '(lambda (x) (* 2 x))))

この場合、無名関数はコンパイルされたコード内のラムダ式に保持されます。バイトコンパイラーは、change-propertyが関数としての使用を意図していることを知ることができないので、たとえこの関数が関数のように見えるとしても、このリストが関数であると決め込むことはできません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.8 Accessing Function Cell Contents

あるシンボルの関数定義(function definition)とは、そのシンボルの関数セルに格納されたオブジェクトのことです。ここでは、シンボルの関数セルにアクセス、テスト、セットする関数を説明します。

Definition of indirect-functionの、関数indirect-functionも参照してください。

Function: symbol-function symbol

これはsymbolの関数セル内のオブジェクトをreturnします。これは、returnされたオブジェクトが本物のの関数であるかチェックしません。

関数セルがvoidの場合、return値はnilです。関数セルがvoidのときと、nilがセットされているときを区別するには、fboundp(以下参照)を使用します。

(defun bar (n) (+ n 2))
(symbol-function 'bar)
     ⇒ (lambda (n) (+ n 2))
(fset 'baz 'bar)
     ⇒ bar
(symbol-function 'baz)
     ⇒ bar

シンボルに何の関数定義も与えていない場合、そのシンボルの関数セルはvoidだと言います。別の言い方をすると、その関数セルは、どんなLispオブジェクトも保持しません。そのシンボルを関数として呼びだそうとすると、Emacsはvoid-functionエラーをシグナルします。

voidは、nilやシンボルvoidとは異なることに注意してください。シンボルnilおよびvoidはLispオブジェクトであり、他のオブジェクトと同様、関数セルに格納することができます(これらのシンボルはdefunを使用して有効な関数に成ることができます)。voidである関数セルは、どのようなオブジェクトも含みません。

fboundpを使用して、任意のシンボルの関数定義がvoidかどうかテストすることができます。シンボルに関数定義を与えた後は、fmakunboundをつかえば、再びvoidにすることができます。

Function: fboundp symbol

この関数は、そのシンボルが関数セルにオブジェクトをもっていればt、それ以外はnilをreturnします。これは、そのオブジェクトが本物の関数であるかチェックしません。

Function: fmakunbound symbol

この関数はsymbolの関数セルをvoidにします。そのため、これ以降に関数セルにアクセスしようと試みると、void-functionエラーが発生します。これはsymbolをreturnします(When a Variable is “Void”makunboundも参照してください)。

(defun foo (x) x)
(foo 1)
     ⇒1
(fmakunbound 'foo)
     ⇒ foo
(foo 1)
error→ Symbol's function definition is void: foo
Function: fset symbol definition

この関数はsymbolの関数セルに、definitionを格納します。結果はdefinitionです。definitionは通常、関数または関数の名前であるべきですが、これはチェックされません。引数symbolは、通常のどおり評価される引数です。

この関数は主に、関数を定義したり変更すして構成を行う、defunadvice-addのようなものからサブルーチンとして使用されます。シンボルにたいして、たとえばキーボードマクロ(Keyboard Macrosを参照してください)のような、関数ではない関数定義与えるためにも使用することができます:

;; 名前つきのキーボードマクロを定義する。
(fset 'kill-two-lines "\^u2\^k")
     ⇒ "\^u2\^k"

関数にたいして別の名前を作成するためにfsetを使いたい場合は、かわりにdefaliasの使用を考慮してください。Definition of defaliasを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.9 Closures

Scoping Rules for Variable Bindingsで説明したように、Emacsはオプションで変数のレキシカルバインディングを有効にできます。レキシカルバインディングが有効な場合、あなたが(たとえばdefunなどで)作成した任意の名前つき関数、同様にlambdaマクロ、functionスペシャルフォーム、#'構文を使用して作成した任意の無名関数(Anonymous Functionsを参照してください)は、自動的にクロージャー(closure)に変換されます。

クロージャーとは、その関数が定ぎされたどときに存在したレキシカル環境の記録もあわせもつ関数です。クロージャーが呼び出されたとき、定義内のレキシカル変数の参照には、その保持されたレキシカル環境を使用されます。他のすべての点では、クロージャーは通常の関数と同様に振る舞います。特に、クロージャーは通常の関数と同じ方法で呼び出すことができます。

クロージャー使用する例は、Lexical Bindingを参照してください。

現在のところ、Emacs Lispのクロージャーオブジェクトは、1つ目の要素にシンボルclosureをもつリストとして表現されます。そのリストは2つ目の要素としてレキシカル環境を表し、残りの要素で引数リストとbodyフォームを表します:

;; レキシカルバインディングが有効。
(lambda (x) (* x x))
     ⇒ (closure (t) (x) (* x x))

しかし実際には、クロージャーの内部構造は、内部的な実装の詳細と判断される残りのLisp界を“晒け出す”ものだと言えます。この理由により、クロージャーオブジェクトの構造を直接調べたり変更することは推奨しません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10 Advising Emacs Lisp Functions

他のライブラリーの関数定義を変更する必要があるとき、またはfoo-functionoのようなフックやプロセスフィルター(process filter)、または関数を値としてもつ任意の変数またはオブジェクトを変更する必要があるときには、名前つきの関数にはfsetdefun、フック変数にはsetq、プロセスフィルターにはset-process-filterのように、適切なセッター関数(setter function)を使用することができます。しかし、これらが以前の値を完全に破棄してしまうのが好ましくない場合もあります。

アドバイス(advice)機能により、関数にアドバイスすることにより、既存の関数定義に機能を追加できます。これは関数全体を再定義するより明解な手法です。

Emacsのアドバイスシステムは2つのプリミティブセットを提供します。コアとなるセットは、変数やオブジェクトのフィールドに保持された関数値にたいするものです(対応するプリミティブはadd-functionremove-functionです)。もう1つのセットは、名前つき関数の最上位のレイヤーとなるものです(主要なプリミティブはadvice-addadvice-removeです)。

たとえば、プロセスprocのプロセスフィルターの呼び出しをトレースするためには、以下を使用できます:

(defun my-tracing-function (proc string)
  (message "Proc %S received %S" proc string))

(add-function :before (process-filter proc) #'my-tracing-function)

これにより、そのプロセスの出力は、元のプロセスフィルターに渡される前に、my-tracing-functionに渡されるようになります。my-tracing-functionは元の関数と同じ引数を受け取ります。これを行った場合、以下のようにしてトレースを行わない振る舞いにリバートすることができます。

(remove-function (process-filter proc) #'my-tracing-function)

同様に、display-bufferという名前つきの関数の実行をトレースしたい場合は、以下を使用できます:

(defun his-tracing-function (orig-fun &rest args)
  (message "display-buffer called with args %S" args)
  (let ((res (apply orig-fun args)))
    (message "display-buffer returned %S" res)
    res))

(advice-add 'display-buffer :around #'his-tracing-function)

ここで、his-tracing-functionは元の関数のかわりに呼び出され、元の関数(加えてその関数の引数)を引数として受け取るので、必要な場合はそれを呼び出すことができます。出力を確認し終えたら、以下のようにしてトレースしない振る舞いにリバートできます:

(advice-remove 'display-buffer #'his-tracing-function)

上記の例で使用されている引数:before:aroundは、2つの関数が構成される方法を指定します(これを行うには多くの方法があるからです)。追加された関数も、アドバイス(advice)と呼ばれます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10.1 Primitives to manipulate advices

Macro: add-function where place function &optional props

このマクロはplace(Generalized Variablesを参照してください)に格納された関数に、アドバイスfunctionを追加する手軽な方法です。

whereは、既存の関数のどこに — たとえば元の関数の前、または後に — functionが構成されるかを決定します。2つの関数を構成するために利用可能な方法のリストは、Ways to compose advicesを参照してください。

(通常は名前が-functionで終わる)変数を変更するときには、functionがグローバルに使用されるか、あるいはカレントバッファーだけに使用されるか選ぶことができます。placeが単にシンボルの場合、functionplaceのグローバル値に追加されます。place(local symbol)というフォームの場合、symbolはその変数の名前をreturnする式なので、functionはカレントバッファーだけに追加されます。最後に、レキシカル変数を変更したい場合には、(var variable)を使用する必要があるでしょう。

add-functionで追加されたすべての関数は、自動的にプロパティーpropsの関連リストに加えることができます。現在のところ、特別な意味をもつのは2つのプロパティーだけです:

name

これはアドバイスの名前を与えます。この名前は、remove-functionが取り除く関数を識別するのに使用できます。これは通常、functionが無名関数のときに使用されます。

depth

これは複数のアドバイスが与えられたときに、どのようにアドバイスを順番づけるかを指定します。depthのデフォルト0です。depthが100のとき、このアドバイスは可能な限りの深さを保持すべきことを意味し、-100のときは最外のアドバイスに留めることを意味します。同じdepthで2つのアドバイスが指定された場合、もっとも最近に追加されたアドバイスが最外になります。

:beforeアドバイスにたいしては、最外(outermost)になるということは、このアドバイスが他のアドバイスの前、つまり1番目に実行されることを意味し、最内(innermost)とは元の関数が実行される直前、すなわちこのアドバイスと元の関数の間に実行されるアドバイスは存在しないことを意味します。同様に:afterアドバイスにたいしては、最内とは元の関数の直後、つまりこの元の関数とアドバイスの間に実行される他のアドバイスは存在せず、最外とは他のすべてのアドバイスが実行された後にこのアドバイスが実行されることを意味します。:overrideの最内アドバイスは、元の関数だけをオーバーライドし、他のアドバイスは適用されませんが、:overrideの最外アドバイスは元の関数だけではなく。その他すべての適用済みのアドバイスををオーバーライドします。

functionがインタラクティブでない場合、欠オグされた関数は、(もしあれば)元の関数のインタラクティブ指定(interactive spec)を継承します。それ以外は、結合された関数はインタラクティブになり、functionのインタラクティブ指定を使用します。1つ例外があります。functionのインタラクティブ指定が、(式や文字列ではない)関数の場合、元の関数のインタラクティブ指定を唯一の引数として、その関数を呼び出して、それが結合された関数のインタラクティブ指定になります。引数として受け取ったインタラクティブ指定を解釈するためには、advice-eval-interactive-specを使用します。

注意: functionのインタラクティブ指定は結合された関数に適用され、functionではなく、結合された関数の呼び出し規約に従うべきです。多くの場合、これらは等しいので差異は生じませんが、function:around:filter-argsfilter-returnでは、重要になります。

Macro: remove-function place function

このマクロはplaceに格納された関数から、functionを取り除きます。これは、add-functionを使用して、functionplaceに追加されたときだけ機能します。

functionは、placeに追加された関数にたいして、ラムダ式にたいしても機能するように、equalを使用して比較を試みます。これは追加でplaceに追加された関数のnameプロパティーも比較します。これはequalを使用してラムダ式を比較するより信頼性があります。

Function: advice-function-member-p advice function-def

adviceがすでにfunction-def内にある場合は、非nilをreturnします。上記のremove-functionと同様、実際の関数adviceのかわりに、アドバイス断片(piece of advice)のnameも使用できます。

Function: advice-function-mapc f function-def

function-defに追加されたすべてのアドバイスに対して、関数fを呼び出します。fは2つの引数 — アドバイス関数と、それのプロパティーで呼びだされます。

Function: advice-eval-interactive-spec spec

そのような指定で関数がインタラクティブに呼び出されたように、インタラクティブ指定specを評価して、構築された引数のリストに対応するリストをreturnします。たとえば、(advice-eval-interactive-spec "r\nP")は、リージョンの境界、カレントプレフィクス引数を含む、3つの要素からなるリストをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10.2 Advising Named Functions

アドバイスの一般的な使い方は、名前つき関数やマクロにたいして使用する方法です。これは単にadd-functionを使用して以下のように行うことができます:

(add-function :around (symbol-function 'fun) #'his-tracing-function)

しかし、かわりにadvice-addadvice-removeを使うべきです。この別の関数セットは名前つき関数に適用されるアドバイス断片を操作するためのもので、add-functionと比較して以下の追加機能があります。まず、これらはマクロおよびオートロードされた関数を扱う方法を知っています。次に、describe-functionにたいして、追加されたアドバイスと同様に、元のドキュメント文字列を維持します。さらに、関数が定義される前でも、アドバイスの追加と削除ができます。

既存の関数を関数全体を再定義せずに、既存の呼び出しを変更するために、advice-addは有用になります。しかし、その関数の既存の呼び出し元は、古い振る舞いを前提としているかもしれず、アドバイスによりその振る舞いが変更されたときに正しく機能しないかもしれないので、これはソースのバグにもなり得ます。アドバイスはデバッグを難しくする可能性もあります。デバッグを行う人は、その関数がアドバイスにより変更されたことに気づかなかったり、失念しているかもしれません。

これらの理由により、他の方法で関数の振る舞いを変更できない場合のために、アドバイスの使用は控えるべきです。フックを通じて同じことが行えるなら、フック(Hooksを参照してください)の使用が望ましい方法です。特定のキーが行う何かを変更したいだけなら、新しいコマンドを記述して、古いコマンドのキーバインドを新しいコマンドに再マップ(Remapping Commandsを参照してください)するのが、おそらくより良い方法です。特に、Emacs自身のソースファイルは、Emacs内の関数をアドバイスするべきではありません(現在のところこの慣習には数少ない例外がありますが、わたしたちはこれを改善しようと思っています)。

スペシャルフォーム(Special Formsを参照してください)はアドバイスできませんが、マクロは関数と同じ方法でアドバイスできます。もちろん、これはすでにマクロ展開されたコードには影響しないため、マクロ展開前にアドバイスが確実にインストールされる必要があります。

プリミティブ(What Is a Function?を参照してください)にアドバイスするのは可能ですが、2つの理由により通常は行うべきではありません。1つ目の理由は、いくつかのプリミティブはアドバイスのメカニズム内で使用されているため、それらにたいしてアドバイスを行うと無限再帰が発生するからです。2つ目の理由は、多くのプリミティブがCから直接呼び出されていて、そのような呼び出しはアドバイスを無視するからです。したがって、プリミティブにたいしてアドバイスの使用を控えることは、ある呼び出しはアドバイスにしたがい(Lispコードから呼びだされたため)、他の呼び出しではアドバイスにしたがわない(Cコードから呼び出されたため)という混乱した状況を解決します。

Function: advice-add symbol where function &optional props

名前つき関数symbolに、アドバイスfunctionを追加します。wherepropsは、add-function(Primitives to manipulate advicesを参照してください)のときと同じ意味をもちます。

Function: advice-remove symbol function

名前つき関数symbolからアドバイスfunctionを取り除きます。functionにアドバイスのnameを指定することもできます。

Function: advice-member-p function symbol

名前つき関数symbol内にすでにアドバイスfunctionがある場合は、非nilをreturnします。functionにアドバイスのnameを指定することもできます。

Function: advice-mapc function symbol

名前つき関数symbolにすでに追加されたすべての関数にたいして、functionを呼び出します。functionは2つの引数、アドバイス関数と、そのプロパティーで呼び出されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10.3 Ways to compose advices

以下はadd-functionおよびadvice-addwhere引数に可能な値で、そのアドバイスfunctionと元の関数が構成されるべき方法を指定します。

:before

古い関数の前にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (apply function r) (apply oldfun r))

(add-function :before funvar function)は、ノーマルフックにたいする(add-hook 'hookvar function)のような、1関数のフックと同等です。

:after

古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (prog1 (apply oldfun r) (apply function r)))

(add-function :after funvar function)は、ノーマルフックにたいする(add-hook 'hookvar function 'append)のような、1関数のフックと同等です。

:override

これは古い関数を新しい関数に完全に置き換えます。もちろん、remove-functionを呼び出した後に、古い関数は復元されます。

:around

古い関数のかわりにfunctionを呼び出しますが、古い関数はfunctionの追加の引数になります。これはもっとも柔軟な結合です。たとえば、古い関数を異なる引数で呼び出したり、複数回呼び出したり、letバインディングで呼び出したり、あるときは古い関数に処理を委譲し、またあるときは完全にオーバーライドすることが可能になります。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (apply function oldfun r))
:before-while

古い関数の前にfunctionを呼び出し、functionnilをreturnした場合は古い関数を呼び出しません。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (and (apply function r) (apply oldfun r)))

(add-function :before-while funvar function)は、run-hook-with-args-until-failureを通じてhookvarが実行されたときの(add-hook 'hookvar function)のような、1関数のフックと同等です。

:before-until

古い関数の前にfunctionを呼び出し、functionnilをreturnした場合だけ古い関数を呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (or (apply function r) (apply oldfun r)))

(add-function :before-until funvar function) は、run-hook-with-args-until-successを通じてhookvarが実行されたときの(add-hook 'hookvar function)のような、1関数のフックと同等です。

:after-while

古い関数が非nilをreturnした場合だけ、古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、functionのreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (and (apply oldfun r) (apply function r)))

(add-function :after-while funvar function)は、run-hook-with-args-until-failureを通じてhookvarが実行されたときの(add-hook 'hookvar function 'append)のような、1関数のフックと同等です。

:after-until

古い関数がnilをreturnした場合だけ、古い関数の後にfunctionを呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (or  (apply oldfun r) (apply function r)))

(add-function :after-until funvar function)は、run-hook-with-args-until-successを通じてhookvarが実行されたときの(add-hook 'hookvar function 'append)のような、1関数のフックと同等です。

:filter-args

最初にfunctionを呼び出し、その結果(リスト)を新たな引数として古い関数に渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (apply oldfun (funcall function r)))
:filter-return

最初に古い関数を呼び出し、その結果をfunctionに渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (funcall function (apply oldfun r)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10.4 Adapting code using the old defadvice

多くのコードは古いdefadviceメカニズムを使用しており、これらの大半はadvice-addにより陳腐化しました。advice-addの実装と意味は、とてもシンプルです。

古いアドバイスは以下のようなものです:

(defadvice previous-line (before next-line-at-end
                                 (&optional arg try-vscroll))
  "Insert an empty line when moving up from the top line."
  (if (and next-line-add-newlines (= arg 1)
           (save-excursion (beginning-of-line) (bobp)))
      (progn
        (beginning-of-line)
        (newline))))

新しいアドバイスメカニズムを使用すれば、これを通常の関数に変換できます:

(defun previous-line--next-line-at-end (&optional arg try-vscroll)
  "Insert an empty line when moving up from the top line."
  (if (and next-line-add-newlines (= arg 1)
           (save-excursion (beginning-of-line) (bobp)))
      (progn
        (beginning-of-line)
        (newline))))

これが実際のprevious-lineを変更しないことは明確です。古いアドバイスには、以下が必要です:

(ad-activate 'previous-line)

一方、新しいアドバイスメカニズムでは、以下が必要です:

(advice-add 'previous-line :before #'previous-line--next-line-at-end)

ad-activateはグローバルな効果をもつことに注意してください。これは、指定された関数にたいして、アドバイスのすべての断片を有効にします。特定のアドバイスだけをアクティブ、または非アクティブにしたい場合、ad-enable-advice、またはad-disable-adviceにより、有効または無効にする必要があります。新しいメカニズムではこの区別はなくなりました。

以下のようなaroundのアドバイスがあるとします:

(defadvice foo (around foo-around)
  "Ignore case in `foo'."
  (let ((case-fold-search t))
    ad-do-it))
(ad-activate 'foo)

これは以下のように変換できます:

(defun foo--foo-around (orig-fun &rest args)
  "Ignore case in `foo'."
  (let ((case-fold-search t))
    (apply orig-fun args)))
(advice-add 'foo :around #'foo--foo-around)

アドバイスのクラスについて、新たな:beforeは、古いbeforeは完全に等価ではないことに注意してください。なぜなら古いアドバイス内では、(たとえばad-set-argを使って)その関数の引数を変更できそれは元の関数が参照する引数値に影響します。しかし新しい:beforeは、setqを通じてアドバイス内の引数をし、その変更は元の関数からの参照に影響しません。この振る舞いにもとづいてbeforeアドバイスを移行するときは、代わりにそれを新たなアドバイス:aroundまたは:filter-argsに変更する必要があるでしょう。

同様に、古いafterアドバイスは、ad-return-valueを変更することによりreturn値を変更できますが、新しい:afterは変更できないので、そのようなafterを移行するときは、かわりにそれらを新しいアドバイス:aroundまたは:filter-returnに変更する必要があるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.11 Declaring Functions Obsolete

名前つき関数を陳腐化している(obsolete)とマークすることができます。これは、その関数が将来のある時点で削除されるかもしれないことを意味します。陳腐化しているとマークされた関数を含むコードをバイトコンパイルしたとき、Emacsは警告を発します。また、その関数のヘルプドキュメントは表示されなくなります。他の点においては、陳腐化した関数は他の任意の関数と同様に振る舞います。

関数を陳腐化しているとマークするもっとも簡単な方法は、その関数のdefun定義に(declare (obsolete …))を配置することです。The declare Formを参照してください。かわりに、以下で説明しているmake-obsolete関数を使うこともできます。

make-obsoleteを使用して、マクロ(Macrosを参照してください)を陳腐化しているとマークすることもできます。これは関数のときと同じ効果をもちます。関数またはマクロにたいするエイリアスも、陳腐化しているとマークできます。これはエイリアス自身をマークし、名前解決される関数またはマクロにたいしてではありません。

Function: make-obsolete obsolete-name current-name &optional when

この関数は、obsolete-nameを陳腐化しているとマークします。obsolete-nameには関数またはマクロを名前づけるシンボル、、または関数やマクロにたいするエイリアスを指定します。

current-nameがシンボルの場合は、obsolete-nameのかわりにcurrent-nameの使用を促す警告メッセージになります。current-nameは、obsolete-nameにたいするエイリアスである必要はありません。似たような機能をもつ、別の関数かもしれません。current-nameには、警告メッセージとなる文字列も指定できます。メッセージは小文字で始まりピリオドで終えるべきです。nilも指定でき、この場合には警告メッセージに追加の詳細は提供されません。

whenが与えられた場合、それは最初にその関数が陳腐化する時期を示す文字列 — たとえば火付けやリリース番号を指定します。

Macro: define-obsolete-function-alias obsolete-name current-name &optional when doc

この便利なマクロは関数obsolete-nameを陳腐化しているとマークするとともに、それを関数current-nameのエイリアスにします。これは以下と等価です:

(defalias obsolete-name current-name doc)
(make-obsolete obsolete-name current-name when)

加えて、陳腐化した関数にたいする特定の呼び出し規約をマークできます。

Function: set-advertised-calling-convention function signature when

この関数は、functionを呼び出す正しい方法として、引数リストsignatureを指定します。これにより、Emacs Lispプログラムが他の方法でfunctionを呼び出している場合には、Emacsのバイトコンパイラーが警告を発します(それでもコードはバイトコンパイルされます)。whenには、その変数が最初に陳腐化するときを示す文字列(通常はバージョン番号)を指定します。

たとえば、古いバージョンのEmacsでは、sit-forには以下のように3つの引数を指定していました

  (sit-for seconds milliseconds nodisp)

しかしこの方法によるsit-forの呼び出しは陳腐化していると判断されます(Waiting for Elapsed Time or Inputを参照してください)。以下のように、古い呼び出し規約は推奨されません:

(set-advertised-calling-convention
  'sit-for '(seconds &optional nodisp) "22.1")

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.12 Inline Functions

インライン関数(inline function)は関数と同様に機能しますが、1つ例外があります。その関数の呼び出しがバイトコンパイルされると(Byte Compilationを参照してください)、その関数の定義が呼び出し元に展開されます。インライン関数を定義するには、defunのかわりにdefsubstを使用します。

Macro: defsubst name args [doc] [declare] [interactive] body…

このマクロはインライン関数を定義します。マクロの構文はdefunとまったく同じです(Defining Functionsを参照してください)。

関数をインラインにすることにより、その関数の呼び出しが高速になる場合があります。しかし欠点もあります。1つは柔軟性の減少です。その関数の定義を変更した場合、すでにインライン化された呼び出しは、リコンパイルを行うまで古い定義を使用します。

もう1つの欠点は、大きな関数をインライン化することにより、コンパイルされたコードのファイル上およびメモリー上のサイズが増大することです。スピード面でのインライン化の有利性は小さい関数にたいして顕著なので、一般的に大きな関数をインライン化するべきではありません。

インライン関数は、デバッグ、トレース、アドバイス(Advising Emacs Lisp Functionsを参照してください)に際してうまく機能しません。デバッグの容易さと関数の再定義の柔軟さはEmacsの重要な機能なので、スピードがとても重要であり、defunの使用が実際に性能の面で問題となるのか検証するためにすでにコードをチューニングしたのでなければ、たとえその関数が小さくてもインライン化するべきでは ありません。

インライン関数が実行するのと同じコードに展開されるマクロ(Macrosを参照してください)を定義することは可能です。しかし式内でのマクロの直接の使用には制限があります — applymapcarなどでマクロを呼び出すことはできません。通常の関数からマクロへの変換には、そのための余分な作業が必要になります。通常の関数をインライン関数に変換するのは簡単です。defundefsubstに置き換えるだけです。インライン関数の引数はそれぞれ正確に1回評価されるので、マクロのときのように、bodyで引数を何回使用するか心配する必要はありません。

インライン関数を定義した後、そのインライン展開はマクロ同様、同じファイル内の後の部分で処理されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.13 The declare Form

declare(宣言)は特別なマクロで、関数やマクロに“メタ”プロパティーを追加するために使用できます。たとえば陳腐化しているとマークしたり、Emacs Lispモード内の特別なTABインデント規則を与えることができます。

Macro: declare specs…

このマクロは引数を無視して、nilとして評価され、実行時の効果はありません。しかしdefunまたはdefsubst(Defining Functionsを参照してください)、またはdefmacroマクロ(Defining Macrosを参照してください)の定義のdeclare引数にdeclareフォームがある場合は、specsで指定されたプロパティーを関数またはマクロに追加します。これはdefundefsubstdefmacroにより特別に処理されます。

specs内の各要素は(property args…)というフォームをもつべきです。また、クォートするべきではありません。これらは、以下の効果をもちます:

(advertised-calling-convention signature when)

これはset-advertised-calling-convention(Declaring Functions Obsoleteを参照してください)の呼び出しと同じように振る舞います。signatureはその関数(またはマクロにたいする正しい引数リスト)で、whenは古い引数リストが最初に陳腐化する時期を示す文字列を指定します。

(debug edebug-form-spec)

これはマクロだけに有効です。Edebugでそのマクロ入ったときに、edebug-form-specを使用します。Instrumenting Macro Callsを参照してください。

(doc-string n)

それ自身が関数、マクロ、または変数のようなエンティティーを定義するために使用される関数やマクロを定義するときに使用されます。これはn番目の引数を示し、もしあれば、それはドキュメント文字列です。

(indent indent-spec)

この関数(またはマクロ)にたいするインデント呼び出しは、indent-specにしたがいます。これは関数でも機能しますが、通常はマクロで使用されます。Indenting Macrosを参照してください。

(obsolete current-name when)

make-obsolete(Declaring Functions Obsoleteを参照してください)と同様に、関数(またはマクロ)を陳腐化しているとマークします。current-nameにはシンボル(かわりにこのシンボルを使うことをすすめる警告メッセージになります)、文字列(警告メッセージを指定します)、またはnil(警告メッセージには追加の詳細が含まれません)を指定します。whenには、その関数(またはマクロ)が最初に陳腐化する時期を示す文字列を指定します。

(compiler-macro expander)

これは関数だけに使用でき、最適化関数(optimization function)としてexpanderを使用するようコンパイラーに告げます。(function args…)のようなその関数への呼び出しフォームに出会うと、マクロ展開機能(macro expander)はargs…と同様のフォームでexpanderを呼び出します。expanderはその関数呼び出しのかわりに使用するための新しい式、または変更されていないフォーム(その関数呼び出しを変更しないことを示す)のどちらかをreturnすることができます。expanderにはシンボル、またはフォーム(lambda (arg) body)を指定できます。フォームの場合、argは元の関数呼び出し式を保持して、その関数の形式に適う引数を使用することにより、その関数にたいする(評価されていない)引数にアクセスできます。

(gv-expander expander)

expandergv-define-expanderと同様、汎変数としてマクロ(または関数)にたいする呼び出しを処理する関数であることを宣言します。expanderはシンボル、またはフォーム(lambda (arg) body)を指定できます。フォームの場合、その関数は追加でそのマクロ(または関数)にアクセスできます。

(gv-setter setter)

setterが、汎変数としてマクロ(または関数)にたいする呼び出しを処理する関数であることを宣言します。setterはシンボル、またはフォームを指定できます。シンボルの場合、そのシンボルはgv-define-simple-setterに渡されます。フォームの場合は(lambda (arg) body)という形式で、その関数は追加でマクロ(または関数)にアクセスでき、gv-define-setterに渡されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.14 Telling the Compiler that a Function is Defined

あるファイルをバイトコンパイルするとき、コンパイラーが知らない関数について警告が生成されるときがあります(Compiler Errorsを参照してください)。実際に問題がある場合もありますが、問題となっている関数がそのコードの実行時にロードされる他のファイルで定義されている場合が通常です。たとえば以前は、fortran.elをバイトコンパイルすると、以下のような警告が出ていました:

In end of data:
fortran.el:2152:1:Warning: the function `gud-find-c-expr' is not
    known to be defined.

実際のところ、gud-find-c-exprは、Fortranモードが使用するgud-find-expr-functionのローカル値(GUDからのコールバック)の中だけで使用されていて、呼びだされた場合はGUD関数がロードされます。そのような警告が実際には問題を示さないことを知っているときには、警告を抑制したほうがよいでしょう。そうすれば、実際に問題があることを示す新しい警告の識別性が良くなります。declare-functionを使用して、これを行うことができます。

必要なのは、問題となっている関数を最初に使用する前にdeclare-function命令を追加するだけです:

(declare-function gud-find-c-expr "gud.el" nil)

これはgud-find-c-exprgud.el(‘.el’は省略可)の中で定義していることを告げます。コンパイラーは関数がそのファイルで実際に定義されているとみなし、チェックを行いません。

3つ目の引数はオプションで、gud-find-c-exprの引数リストを指定します。この例では、引数はありません(nilと値を指定しないのは、異なります)。それ以外の場合は、(file &optional overwrite)のようになります。引数リストを指定する必要はありませんが、指定すればコンパイラーはその呼び出しが宣言と合致するかチェックできます。

Macro: declare-function function file &optional arglist fileonly

バイトコンパイラーにたいして、引数arglistをとるfunctionが定義されていて、その定義はfileにあるとみなすように告げます。fileonlyが非nilの場合は、fileが存在することだけをチェックして、実際のfunctionの定義はチェックしないことを意味します。

これらの関数がdeclare-functionが告げる場所で実際に宣言されているか検証するには、check-declare-fileを使用して、1つのソースファイル中のすべてのdeclare-function呼び出しをチェックするか、check-declare-directoryを使用して、特定のディレクトリー配下のすべてのファイルをチェックします。

これらのコマンドは、locate-libraryで使用する関数の定義を含むべきファイルを探します。ファイルが見つからない場合、これらのコマンドはdeclare-functionの呼び出しを含むファイルをがあるディレクトリーからの相対ファイル名に、定義ファイル名を展開します。

.c’や‘.m’で終わるファイル名を指定することにより、プリミティブ関数を指定することもできます。これが有用なのは、特定のシステムだけで定義されるプリミティブを呼び出す場合だけです。ほとんどのプリミティブは常に定義されているので、それらについて警告を受け取ることはありえないはずです。

あるファイルがオプションとして外部のパッケージの関数を使う場合があります。declare-function命令内のファイル名のプレフィクスを‘ext:’にすると、そのファイルが見つかった場合はチェックして、見つからない場合はエラーとせずにスキップします。

check-declare’が理解しない関数定義もいくつか存在します(たとえばdefstructや、その他いくつかのマクロ)。そのような場合、declare-functionfileonly引数に、非nilを渡すことができます。これはファイルの存在だけをチェックして、その関数の実際の定義はチェックしないことを意味します。これを行う場合、引数リストを指定する必要はないのですが、arglist引数にはtをセットするべきだということに注意してください(なぜならnilは、引数リストが指定されなかったという意味ではなく、空の引数リストを意味するからです)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.15 Determining whether a Function is Safe to Call

SESのようないくつかのメジャーモードは、ユーザーファイル内に格納された関数を呼び出します(See (ses)Top, for more information on SESを参照してください)。 ユーザーファイルには素性があやふやな場合があります — 初対面の人から受け取ったスプレッドシートかもしれず、会ったことのない誰かから受け取ったeメールかもしれません。そのため、ユーザーファイルに格納されたソースコードの関数を呼び出すのは、それが安全だと決定されるすまでは危険です。

Function: unsafep form &optional unsafep-vars

form安全(safe)なLisp式の場合はnil、危険な場合はなぜその式が危険かもしれないのか説明するリストをreturnします。引数unsafep-varsは、この時点で一時的なバインドだと判っているシンボルのリストです。これは主に内部的な再帰呼び出しで使用されます。カレントバッファーは暗黙の引数になり、これはバッファーローカルなバインディングのリストを提供します。

高速かつシンプルにするために、unsafepは、とても軽量な分析を行うので、実際には安全な多くのLisp式を拒絶します。安全ではない式にたいして、unsafepnilをreturnするケースは確認されていません。しかし“安全”なLisp式はdisplayプロパティーと一緒に文字列をreturnでき、これはその文字列がバッファーに挿入された後に実行される、割り当てられたLisp式を含みます。割り当てられた式は、ウィルスかもしれません。安全であるためには、バッファーへ挿入する前に、ユーザーコードにより計算されたすべての文字列からプロパティーを削除しなければなりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.16 Other Topics Related to Functions

以下のテーブルは、関数呼び出しと関数定義に関連したことを行ういくつかの関数です。これらは別の場所で説明されているので、ここではクロスリファレンスを提供します。

apply

Calling Functionsを参照してください。

autoload

Autoloadを参照してください。

call-interactively

Interactive Callを参照してください。

called-interactively-p

Distinguish Interactive Callsを参照してください。

commandp

Interactive Callを参照してください。

documentation

Access to Documentation Stringsを参照してください。

eval

Evalを参照してください。

funcall

Calling Functionsを参照してください。

function

Anonymous Functionsを参照してください。

ignore

Calling Functionsを参照してください。

indirect-function

Symbol Function Indirectionを参照してください。

interactive

Using interactiveを参照してください。

interactive-p

Distinguish Interactive Callsを参照してください。

mapatoms

Creating and Interning Symbolsを参照してください。

mapcar

Mapping Functionsを参照してください。

map-char-table

Char-Tablesを参照してください。

mapconcat

Mapping Functionsを参照してください。

undefined

Functions for Key Lookupを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13 Macros

マクロ(macros)は、新たな制御構造や、他の言語機能の定義を可能にします。マクロは関数のように定義されますが、値の計算方法を指定するかわりに、値を計算する別のLisp式を計算する方法を指示します。わたしたちはこの式のことをマクロの展開形(expansion)と呼んでいます。

マクロは、関数が行うように引数の値を処理するのではなく、引数のために未評価の式を処理することにより、これを行うことができます。したがってマクロは、これらの引数式またはその一部をを含む式を構築することができます。

マクロを使用して通常の関数が行えることを行う場合、単にそれが速度面の理由ならば、かわりにインライン関数の使用を考慮してください。Inline Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.1 A Simple Example of a Macro

Cの++演算子のように、変数の値をインクリメントするためのLisp構造を定義したいとします。(inc x)のように記述すると、(setq x (1+ x))という効果を得たいとします。以下はこれを行うマクロ定義です:

(defmacro inc (var)
   (list 'setq var (list '1+ var)))

これを(inc x)のように呼び出すと、引数varはシンボルxになります — 関数のときのようにxではありません。このマクロのbodyはこれを展開の構築に使用して、展開形は(setq x (1+ x))になります。マクロが1度この展開形をreturnすると。Lispはそれを評価するので、xはインクリメントされます。

Function: macrop object

この術後は、その引数がマクロかどうかテストして、もしマクロならt、それ以外はnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.2 Expansion of a Macro Call

マクロ呼び出しは、関数の呼び出しと同じ外観をもち、マクロの名前で始まるリストで表されます。そのリストの残りの要素は、マクロの引数になります。

マクロ呼び出しの評価は、1つの重大な違いを除き、関数の評価と同じように開始されます。重要な違いとは、そのマクロの引数はマクロ呼び出し内で実際の式として現れます。これらの引数はマクロ定義に与えられる前には評価されません。対象的に、関数の引数は、その関数の呼び出しリストの要素を評価した結果です。

こうして得た引数を使用して、Lispは関数呼び出しのように、マクロ定義を呼び出します。マクロの引数変数はマクロ呼び出しの引数値にバインドされるか、a &rest引数の場合は引数地のリストになります。そして、そのマクロのbodyが実行されて、関数bodyが行うように、マクロbodyの値をreturnsします。

マクロと関数の2つ目の重要な違いは、マクロのbodyからreturnされる値が、代替となるLisp式であることで、これはマクロの展開(expansion)としても知られます。Lispインタープリターは、マクロから展開形が戻されると、すぐにその展開形の評価を行います。

展開形は通常の方法で評価されるので、もしかしたらその展開形は他のマクロの呼び出しを含むかもしれません。一般的ではありませんが、もしかすると同じマクロを呼び出すかもしれません。

EmacsはコンパイルされていないLispファイルをロードするときに、マクロの展開を試みることに注意してください。これは常に利用可能ではありませんが、もし可能なら、それ以降の実行の速度を改善します。How Programs Do Loadingを参照してください。

macroexpandを呼び出すことにより、与えられたマクロ呼び出しにたいする展開形を確認することができます。

Function: macroexpand form &optional environment

この関数は、それがマクロ呼び出しの場合は、formを展開します。結果が他のマクロ呼び出しの場合は、結果がマクロ呼び出しでなくなるまで、順番に展開を行います。これはmacroexpandからreturnされる値になります。formがマクロ呼び出しで開始されない場合、与えられたformをそのままreturnします。

macroexpandは、(たとえいくつかのiマクロ定義がそれを行っているとしても)formの部分式(subexpression)を調べないことに注意してください。たとえ部分式自身がマクロ呼び出しの場合でも、macroexpandはそれらを展開しません。

関数macroexpandは、インライン関数の呼び出しを展開しません。なぜならインライン関数の呼び出しは、通常の関数呼び出しと比較して理解が難しい訳ではないので、通常はそれを行う必要がないからです。

environmentが与えられた場合、それはそのとき定義されているマクロをシャドーするマクロのalistを指定します。バイトコンパイルはこの機能を使用します。

(defmacro inc (var)
    (list 'setq var (list '1+ var)))
(macroexpand '(inc r))
     ⇒ (setq r (1+ r))
(defmacro inc2 (var1 var2)
    (list 'progn (list 'inc var1) (list 'inc var2)))
(macroexpand '(inc2 r s))
     ⇒ (progn (inc r) (inc s))  ; ここではincは展開されない。
Function: macroexpand-all form &optional environment

macroexpand-allmacroexpandと同様、マクロを展開しますが、ドップレベルだけではなく、form内のすべてのマクロを探して展開します。展開されたマクロがない場合、return値は、formeqになります。

上記macroexpandで使用した例をmacroexpand-allに用いると、macroexpand-allincに埋め込まれた呼び出しの展開を行うことを確認できます:

(macroexpand-all '(inc2 r s))
     ⇒ (progn (setq r (1+ r)) (setq s (1+ s)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.3 Macros and Byte Compilation

なぜわざわざマクロにたいする展開形を計算して、その後に展開形を評価する手間をかけるのか、不思議に思うかもしれません。なぜマクロbodyは直接望ましい結果を生成しないのでしょうか? それはコンパイルする必要があるからです。

コンパイルされるLispプログラム内にマクロ呼び出しがあるとき、Lispコンパイラーはインタープリターが行うようにマクロ定義を呼び出して、展開形を受け取ります。しかし展開形を評価するかわりに、コンパイラーは展開形が直接プログラム内にあるかのようにコンパイルを行います。結果として、コンパイルされたコードはそのマクロにたいする値と副作用を生成しますが、実行速度は完全にコンパイルされた行されたときと同じになります。もしマクロbody自身が値と副作用を計算したら。このようには機能しません — コンパイル時に計算されることになり、それは有用ではありません。

マクロ呼び出しのコンパイルが機能するためには、マクロを呼び出すコードがコンパイルされるとき、そのマクロがLisp内ですでに定義されていなければなりません。コンパイラーには、これを行うのを助ける特別な機能があります。コンパイルされるファイルがdefmacroフォームを含む場合、そのファイルの残りの部分をコンパイルするために、そのマクロが一時的に定義されます。

ファイルをバイトコンパイルすると、ファイル内のトップレベルにある任意のrequire呼び出しも実行されるので、それらを定義しているファイルをrequireすることにより、コンパイルの間、必要なマクロ定義が利用できることが確実になります(Featuresを参照してください)。誰かがコンパイルされたプログラムを実行するときに、マクロ定義ファイルのロードをしないようにするには、require呼び出しの周囲にeval-when-compileを記述します(Evaluation During Compilationを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.4 Defining Macros

Lispのマクロオブジェクトは、CARmacroで、CDRが関数のリストです。マクロの展開形は、マクロ呼び出しから、評価されていない引数のリストに、(applyを使って)関数を適用することにより機能します。

無名関数のように無名Lispマクロを使用することも可能ですが、無名マクロをmapcarのようなファンクショナルに渡すことに意味がないので、これが行われることはありません。実際のところ、すべてのLispマクロは名前をもち、ほとんど常にdefmacroマクロで定義されます。

Macro: defmacro name args [doc] [declare] body…

defmacroはシンボルname(クォートはしない)を、以下のようなマクロ押して定義します:

(macro lambda args . body)

(このリストのCDRはラムダ式であることに注意してください。) このマクロオブジェクトは、nameの関数セルに格納されます。argsの意味は関数の場合と同じで、キーワード&restおよび&optionalが使用されることもあります(Other Features of Argument Listsを参照してください)。nameargsはどちらも、クォートされるべきではありません。defmacroのreturn値は未定義です。

docが与えられた場合、それはマクロのドキュメント文字列を指定する文字列です。declareが与えられた場合、それはマクロのメタデータを指定するdeclareフォームです(The declare Formを参照してください)。マクロを対話的に呼び出すことはできないので、インタラクティブ宣言をもつことはできないことに注意してください。

マクロが、定数部と非定数部の混合体から構築される巨大なリスト構造を必要とする場合があります。これを簡単に行うためには、‘`’構文(Backquoteを参照してください)を使用します。たとえば:

(defmacro t-becomes-nil (variable)
  `(if (eq ,variable t)
       (setq ,variable nil)))
(t-becomes-nil foo)
     ≡ (if (eq foo t) (setq foo nil))

マクロ定義のbodyには、そのマクロに関する追加のプロパティーを指定する、declareフォームを含めることができます。The declare Formを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5 Common Problems Using Macros

マクロ展開が、直感に反する結果となることがあり得ます。このセクションでは、問題になりかねない重要な結果と、問題を避けるためにしたがうべきルールをいくつか説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.1 Wrong Time

マクロを記述する際のもっとも一般的な問題は、展開形の中ではなく、マクロ展開中に、早まって実際に何らかの作業を行ってしまうことがあります。たとえば、実際のパッケージが以下のマクロ定義をもつとします:

(defmacro my-set-buffer-multibyte (arg)
  (if (fboundp 'set-buffer-multibyte)
      (set-buffer-multibyte arg)))

この誤ったマクロ定義は、解釈(interpret)されるときは正常に機能しますが、コンパイル時に失敗します。このマクロ定義はコンパイル時にset-buffer-multibyteを呼び出してしまいますが、それは間違っています。その後でコンパイルされたパッケージを実行しても何も行いません。プログラマーが実際に望むのは、以下の定義です:

(defmacro my-set-buffer-multibyte (arg)
  (if (fboundp 'set-buffer-multibyte)
      `(set-buffer-multibyte ,arg)))

このマクロは、もし適切ならset-buffer-multibyteの呼び出しに展開され、それはコンパイルされたプログラム実行時に実行されるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.2 Evaluating Macro Arguments Repeatedly

マクロを定義する場合、展開形が実行されるときに引数が何回評価されるか注意を払わなければなりません。以下の(繰り返し処理を用意にする)マクロで、この問題を示してみましょう。このマクロで“for”によるループ構造を記述できます。

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  (list 'let (list (list var init))
        (cons 'while
              (cons (list '<= var final)
                    (append body (list (list 'inc var)))))))
(for i from 1 to 3 do
   (setq square (* i i))
   (princ (format "\n%d %d" i square)))
→
(let ((i 1))
  (while (<= i 3)
    (setq square (* i i))
    (princ (format "\n%d %d" i square))
    (inc i)))
     -|1       1
     -|2       4
     -|3       9
⇒ nil

マクロ内の引数fromtodoは、“構文糖(syntactic sugar)”であり、完全に無視されます。このアイデアは、マクロ呼び出し中で(from, to, and doのような)余計な単語を、これらの位置に記述できるようにするというものです。

以下は、バッククォートの使用により、より単純化された等価の定義です:

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  `(let ((,var ,init))
     (while (<= ,var ,final)
       ,@body
       (inc ,var))))

この定義のフォームは両方(バッククォートのあるものと、ないもの)とも、各繰り返しにおいて毎回finalが評価されるという欠点をもちます。finalが定数のときには、問題はありません。しかし、これがより複雑な、たとえば(long-complex-calculation x)のようなフォームの場合、実効速度は顕著に低下し得ます。finalが副作用をもつ場合には、複数回実行すると、おそらく正しくなくなります。

うまく設計されたマクロ定義は、繰り返し評価することがそのマクロの意図された目的でない限り、引数を正確に1回評価を行う展開形を生成することにより、この問題を避けるためにステップを費やします。以下はforマクロの正しい展開形です:

(let ((i 1)
      (max 3))
  (while (<= i max)
    (setq square (* i i))
    (princ (format "%d      %d" i square))
    (inc i)))

以下はこの展開形を生成するためのマクロ定義です:

(defmacro for (var from init to final do &rest body)
  "Execute a simple for loop: (for i from 1 to 10 do (print i))."
  `(let ((,var ,init)
         (max ,final))
     (while (<= ,var max)
       ,@body
       (inc ,var))))

残念なことに、この訂正により、以下のセクションで説明する、別の問題が発生します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.3 Local Variables in Macro Expansions

前のセクションでは、forの定義を、展開形がマクロ引数を正しい回数評価するように訂正しました:

(defmacro for (var from init to final do &rest body)
  "Execute a simple for loop: (for i from 1 to 10 do (print i))."
  `(let ((,var ,init)
         (max ,final))
     (while (<= ,var max)
       ,@body
       (inc ,var))))

forの新しい定義には、新たな問題があります。この定義は、ユーザーが意識していない、maxという名前のローカル変数を導入しています。これは、以下の例で示すようなトラブルを招きます:

(let ((max 0))
  (for x from 0 to 10 do
    (let ((this (frob x)))
      (if (< max this)
          (setq max this)))))

forのbodyの内部のmaxへの参照は、maxのユーサーバインディングの参照を意図したものですが、実際にはforにより作られたバインディングにアクセスします。

これを修正する方法は、maxのかわりにinternされていない(uninterned)シンボルを使用することです(Creating and Interning Symbolsを参照してください)。internされていないシンボルは他のシンボルと同じようにバインドして参照することができますが、forにより作成されるので、わたしたちはすでにユーザーのプログラムに存在するはずがないことを知ることができます。これはinternされていないので、プログラムの後続の部分でそれを配置する方法はありません。これはforにより配置された場所をのぞき、他の場所で配置されることはありません。以下はこの方法で機能するforの定義です:

(defmacro for (var from init to final do &rest body)
  "Execute a simple for loop: (for i from 1 to 10 do (print i))."
  (let ((tempvar (make-symbol "max")))
    `(let ((,var ,init)
           (,tempvar ,final))
       (while (<= ,var ,tempvar)
         ,@body
         (inc ,var)))))

作成されたinternされていないシンボルの名前はmaxで、これを通常のinternされたシンボルmaxのかわりに、式内のその位置に記述します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.4 Evaluating Macro Arguments in Expansion

マクロ定義自体が、eval(Evalを参照してください)の呼び出しなどによりマクロ引数式を評価した場合には、別の問題が発生します。その引数がユーザーの変数を参照する場合、ユーザーがマクロ引数と同じな前で変数をしようとした場合に問題となるでしょう。マクロのbodyないでは、マクロ引数のバインディングは、その変数のもっともローカルなバインディングなので、そのフォーム内部の任意の参照は、それを参照するように評価されます。以下は例です:

(defmacro foo (a)
  (list 'setq (eval a) t))
(setq x 'b)
(foo x) → (setq b t)
     ⇒ t                  ; bがセットされる。
;; but
(setq a 'c)
(foo a) → (setq a t)
     ⇒ t                  ; しかし、これはcではなくaがセットされる。

ユーザーの変数の名前がaxかということで、違いが生じています。これはaが、マクロの引数変数aと競合しているからです。

マクロ定義内でのevalの呼び出しにまつわる別の問題は、それがおそらくコンパイル時にあなたが意図したことを行わないだろうということです。バイトコンパイラーは、そのプログラム自身の(あなたがevalでアクセスしたいと望む)計算は発生せず、ローカル変数バインディングも存在しないプログラムのコンパイル時にマクロ定義を実行します。

この問題を避けるためには、マクロ展開形の計算では引数式を評価しないでください。かわりにその式をマクロ展開形の中に置き換えれば、その値は展開形の実行の一部として計算されます。これは、このチャプターの他の例が機能する方法です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.5 How Many Times is the Macro Expanded?

マクロ呼び出しは逐次解釈される関数で毎回マクロ呼び出しが展開されるが、コンパイルされた関数では(コンパイル時に)1回だけしか展開されないという事実にもとづく問題が、時折発生します。そのマクロ定義が副作用をもつ場合、それらのマクロは、そのマクロが難解展開されたかにより、異なる動作をとるでしょう。

したがって、あなたが何をしているか本当に判っていないのであれば、マクロ展開形の計算での副作用は避けるべきです。

避けることのできない特殊な副作用が1つあります。それはLispオブジェクトの構築です。ほとんどすべてのマクロ展開形には、リストの構築が含まれます。リスト構築はほとんどのマクロの核心部分です。これは通常は安全です。用心しなければならないケースが1つだけあります。それは構築するオブジェクトが、マクロ展開形の中でクォートされた定数の一部となるときです。

そのマクロが1回だけ — コンパイル時 — しか展開されない場合、そのオブジェクトの構築もコンパイル時の1回です。しかし逐次実行では、そのマクロはマクロ呼び出しが実行されるたびに展開され、これは毎回新たなオブジェクトが構築されることを意味します。

クリーンなLispコードのほとんどでは、この違いは問題になりません。しかし、マクロ定義によるオブジェクト構築の副作用を処理する場合には、問題になるかもしれません。したがって問題を避けるために、マクロ定義によるオブジェクト構築の副作用を避けてください。以下は副作用により問題が起こる例です:

(defmacro empty-object ()
  (list 'quote (cons nil nil)))
(defun initialize (condition)
  (let ((object (empty-object)))
    (if condition
        (setcar object condition))
    object))

initializeが解釈された場合、initializeが呼び出されるたびに、新しいリスト(nil)が構築されます。したがって、各呼び出しの間において、副作用は存続しません。しかしinitializeがコンパイルされた場合、マクロempty-objectはコンパイル時に展開され、これは1つの“定数”(nil)を生成し、この定数はinitializeの毎回の呼び出しで、再利用・変更されます。

このような異常な状態を避ける1つの方法は、empty-objectを、メモリー割り当て構造ではなく、一種の奇妙な変数と考えることです。'(nil)のような定数にたいしてsetcarを使うことはないでしょうから、当然(empty-object)にも使うことはないでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.6 Indenting Macros

マクロ定義では、マクロ呼び出しをTABがどのようにインデントすべきか指定するために、declareフォーム(Defining Macrosを参照してください)を使うことができます。インデント指定は以下のように記述します:

(declare (indent indent-spec))

以下は利用できるindent-specです:

nil

これはプロパティーを指定しない場合と同じ — 標準的なインデントパターンを使用します。

defun

この関数を‘def’構造 — 2番目の行がbodyの開始 — と同様に扱います。

整数: number

関数の最初のnumber個の引数は区別され、残りは式のbodyと判断されます。その式の中の行は、最初の引数が区別されているかどうかにしたがってインデントされます。引数がbodyの一部である場合、その行はこの式の先頭の 開きカッコ(open-parenthesis)よりもlisp-body-indentだけ多い列にインデントされます。引数が 区別されていて、1つ目または2つ目の引数である場合は、2倍余分にインデントされます。引数が区別されていて1つ目あるいは2つ目の引数でない場合、その行は標準パターンによってインデントされます。

シンボル: symbol

symbolは関数名です。その関数はこの式のインデントを計算するために呼び出される関数です。この関数は2つの引数をとります:

pos

その行のインデントが開始される位置です。

state

その行の開始まで解析されたとき、parse-partial-sexp(インデントとネスト深さの計算のためのLispプリミティブ)によりreturnされる値です。

これは、数(その行のインデントの列数)、またはそのような数がcarであるようなリストをreturnすべきです。数とリストの違いは、数の場合、同じネスト深さの後続のすべての行はこの数と同じインデントとなります。リストの場合、後続の行は異なるインデントを呼び出すかもしれません。これは、C-M-qによりインデントが計算されるときに違いがでます。値が数の場合、C-M-qはリストの終わりまでの後続の行のインデントを、再計算する必要はありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14 Customization Settings

Emacsのユーザーは、カスタマイズインターフェースにより、Lispコードを記述することなく。変数とフェースをカスタマイズできます。Easy Customization in The GNU Emacs Manualを参照してください。このチャプターでは、カスタマイズインターフェースを通じて、ユーザーとやりとりするための、カスタマイズアイテム(customization items)を定義する方法を説明します。

カスタマイズアイテムには、カスタマイズ可能変数(customizable variable: defcustomマクロで定義される。 カスタマイズ可能フェース(customizable face: deffaceで定義される。Defining Facesを参照してください)、および関連するカスタマイズアイテムのグループのためのコンテナーとして働くカスタマイズグループ(customization group: defgroupで定義される) が含まれます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.1 Common Item Keywords

以降のセクションで説明するカスタマイズ宣言(customization declaration) — defcustomdefgroupなどはすべて、さまざまな情報を指定するためのキーワード引数(Variables that Never Changeを参照してください)を受け取ります。このセクションでは、カスタマイズ宣言のすべての種類に適用されるキーワードを説明します。

:tag以外のすべてのキーワードは、与えられたアイテムにたいして複数回使用できます。キーワードの使用はそれぞれ独立した効果をもちます。:tagは例外で、これはすべての与えられたアイテムは1つの名前だけを表示できるからです。

:tag label

labelを使用すると、カスタマイズメニュー(customization menu)およびカスタマイズバッファー(customization buffer)のアイテムのラベルづけに、そのアイテムの名前のかわりに指定された文字列を使用します。混乱を招くので、そのアイテムの実際の名前と、大きく異なる名前は使用しないでください

:group group

このカスタマイズアイテムを、グループgroupに配します。defgroup内で:groupを使用した場合、そのアイテムは新しいグループ(:groupのサブグループ)になります。

このキーワードを複数回使用した場合、1つのアイテムを複数のグループに配すことができます。これらのグループのどれかを表示すると、このアイテムが表示されます。煩わしくなるので、多用しないでください。

:link link-data

このアイテムのドキュメント文字列の後に外部リンクを含めます。これは他のドキュメントを参照する、センテンスを含むボタンです。

link-dataに使用できる複数の候補があります:

(custom-manual info-node)

infoノードへのリンクです。info-nodeは、"(emacs)Top"のような、ノード名を示す文字列です。このリンクはカスタマイズバッファーの‘[Manual]’に表示され、info-nodeにたいしてビルトインのinfoリーダーを起動します。

(info-link info-node)

custom-manualと同様ですが、カスタマイズバッファーには、そのinfoノード名が表示されます。

(url-link url)

ウェブページヘのリンクです。urlURLを指定する文字列です。カスタマイズバッファーに表示されるリンクは、browse-url-browser-functionで指定されたWWWブラウザーを呼び出します。

(emacs-commentary-link library)

ライブラリーのコメントセクション(commentary section)へのリンクです。libraryはライブラリー名を指定する文字列です。Conventional Headers for Emacs Librariesを参照してください。

(emacs-library-link library)

Emacs Lispライブラリーファイルへのリンクです。libraryはライブラリー名を指定する文字列です。

(file-link file)

ファイルへのリンクです。fileは、ユーザーがこのリンクを呼び出したときにfind-fileでvisitするファイルの名前を指定する文字列です。

(function-link function)

関数のドキュメントへのリンクです。functionは、ユーザーがこのリンクを呼び出したときにdescribe-functionで説明を表示する関数の名前を指定する文字列です。

(variable-link variable)

変数のドキュメントへのリンクです。variableは、ユーザーがこのリンクを呼び出したときにdescribe-variableで説明を表示する変数の名前を指定する文字列です。

(custom-group-link group)

他のカスタマイズグループへのリンクです。このリンクを呼び出すことにより、groupにたいする新たなカスタマイズバッファーが作成されます。

link-dataの1つ目の要素の後に:tag nameを追加することにより、カスタマイズバッファーで使用するテキストを指定できます。たとえば(info-link :tag "foo" "(emacs)Top")は、そのバッファーで‘foo’と表示されるEmacs manualへのリンクを作成します。

複数のリンクを追加するために、このキーワードを複数回使用することができます。

:load file

このカスタマイズアイテムを表示する前に、ファイルfileをロードします(Loadingを参照してください)。ロードはloadにより行われ、そのファイルがまだロードされていないときだけロードします。

:require feature

保存したカスタマイズが、このアイテム値をセットするとき、(require 'feature)が実行されます。featureはシンボルです。

:requireを使用するもっとも一般的な理由は、ある変数がマイナーモードのような機能を有効にするとき、そのモードを実装するコードがロードされていない場合には、変数をセットするだけでは効果がないからです。

:version version

このキーワードは、そのアイテムが最初に導入されたEmacsバージョンversion、またはそのアイテムのデフォルト値がそのバージョンで変更されたことを指定します。値versionは文字列でなければなりません。

:package-version '(package . version)

このキーワードは、そのアイテムが最初に導入されたpackageのバージョンversionまたはアイテムの意味(またはデフォルト値)が変更されたバージョンを指定します。このキーワードは:versionより優先されます。

packageにはそのパッケージの公式名をシンボルとして指定します(たとえばMH-E)。versionには文字列を指定します。パッケージpackageがEmacsの一部としてリリースされた場合、packageversionの値は、customize-package-emacs-version-alistの値に表示されるべきです。

Emacsの一部として配布された:package-versionキーワードを使用するパッケージは、customize-package-emacs-version-alist変数も更新しなければなりません。

Variable: customize-package-emacs-version-alist

このalistは、Emacsのバージョンにたいして、:package-versionキーワード内でリストされたパッケージのバージョンへのマッピングを提供します:

(package (pversion . eversion)…)

package(シンボル)それぞれにたいして、パッケージバージョンpversionを含む1つ以上の要素と、それに関連づけられるEmacsバージョンeversionが存在します。これらのバージョンは文字列です。たとえばMH-Eパッケージは、以下でalistを更新します:

(add-to-list 'customize-package-emacs-version-alist
             '(MH-E ("6.0" . "22.1") ("6.1" . "22.1") ("7.0" . "22.1")
                    ("7.1" . "22.1") ("7.2" . "22.1") ("7.3" . "22.1")
                    ("7.4" . "22.1") ("8.0" . "22.1")))

packageの値は一意である必要があり、また:package-versionキーワード内に現れるpackageの値とマッチする必要があります。おそらくユーザーはエラーメッセージからこの値を見るので、MH-EやGnusのようなパッケージの公式名を選択するのがよいでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.2 Defining Customization Groups

Emacs Lispパッケージはそれぞれ、1つのメインカスタマイズグループ(main customization group)をもち、それにはすべてのオプション、フェイス、そのパッケージ内の他のグループが含まれるべきです。そのパッケージには少数のオプションとフェイスしかない場合は、1つのグループだけを使用して、その中にすべてを置きます。20以上のオプションやフェイスがある場合には、それらをサブグループ内に構造化して、そのサブグループをメインカスタマイズグループの下に配します。そのパッケージ内の任意のオプションまたはフェイスを、サブグループと並行してメイングループに配しても構いません。

そのパッケージのメイングループ(または唯一のグループ)は、1つ以上の標準カスタムグループ(standard customization group)のメンバーであるべきです(これらの完全なリストを表示するには、M-x customizeを使用します)。それらの内から1つ以上(多すぎないこと)を選択して、:groupを使用してあなたのグループをそれらに追加します。

新しいカスタマイズグループは、defgroupで宣言します。

Macro: defgroup group members doc [keyword value]…

membersを含む、カスタマイズグループとして、groupを宣言します。シンボルgroupはクォートしません。引数docは、そのグループにたいするドキュメント文字列を指定します。

引数membersは、そのグループのメンバーとなるカスタマイズアイテムの初期セットを指定するリストです。しかしほとんどの場合はmembersnilにして、メンバーを定義するときに:groupキーワードを使用することにより、そのグループのメンバーを指定します。

membersを通じてグループのメンバーを指定したい場合、各要素は(name widget)という形式で指定するべきです。ここでnameはシンボル、widgetはそのシンボルを編集するウィジェット型(widget type)です。有用なウィジェットには、変数にたいするcustom-variable、フェイスにたいするcustom-face、グループにたいするcustom-groupがあります。

Emacsに新しいグループを導入するときは、defgroup内で:versionキーワードを使用します。そうすればグループの個別のメンバーに対してそれを使用する必要がなくなります。

一般的なキーワード(Common Item Keywordsを参照してください)に加えて、defgroupないでは以下のキーワードも使用できます:

:prefix prefix

グループ内のアイテムの名前がprefixで始まり、カスタマイズ変数custom-unlispify-remove-prefixesが非nilの場合、そのアイテムのタグからprefixが省略されます。グループは任意の数のプレフィクスをもつことができます。

User Option: custom-unlispify-remove-prefixes

この変数が非nilの場合、グループの:prefixキーワードで指定されたプレフィクスは、ユーザーがグループをカスタマイズするときは常に、タグ名から省略されます。

デフォルト値はnil、つまりプレフィクス省略(prefix-discarding)の機能は無効です。これは、オプションやフェイスの名前にたいしてプレフィクスを省略するのは、混乱を招くことがあるからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.3 Defining Customization Variables

カスタマイズ可能変数(customizable variable)ユーザーオプション(user option)とも呼ばれ、これはCustomizeインターフェースを通じてセットできるグローなるなLisp変数です。defvar(Defining Global Variablesを参照してください)により定義される他のグローバル変数とは異なり、カスタマイズ可能変数はdefcustomマクロを使用して定義されます。サブルーチンとしてdefvarを呼び出すことに加え、defcustomはCustomizeインターフェースでその変数が表示される方法や、その変数がとることができる値などを明示します。

Macro: defcustom option standard doc [keyword value]…

このマクロはユーザーオプション(またはカスタマイズ可能変数)としてoptionを宣言します。optionはクォートするべきではありません。

引数standardは、optionの標準値を指定する式です。defcustomフォームの評価により、standardが評価されますが、その値にオプションをバインドする必要はありません。optionがすでにデフォルト値をもつ場合、それは変更されずに残ります。ユーザーがすでにoptionにたいするカスタマイズを保存している場合、ユーザーによりカスタマイズされた値がデフォルト値としてインストールされます。それ以外は、standardを評価した結果がデフォルト値としてインストールされます。

defvarと同様、このマクロはoptionをスペシャル変数 — 常にダイナミックにバインドされるべきことを意味する — としてマークします。optionがすでにレキシカルバインドをもつ場合、そのレキシカルバインドはバインディング構造を抜けるまで効果をもちます。Scoping Rules for Variable Bindingsを参照してください。

standardは別の様々な機会にも — カスタマイズ機能がoptionの標準値を知る必要があるときは常に — 評価される可能性があります。そのため任意回数評価しても安全な式を使用するように気をつけてください。

引数docは、その変数にたいするドキュメント文字列を指定します。

defcustomが何も:groupを指定しない場合、同じファイル内でdefgroupにより最後に定義されたグループが使用されます。この方法では、ほとんどのdefcustomは明示的な:groupが必要なくなります。

Emacs LispモードでC-M-x(eval-defun)によりdefcustomフォームを評価するとき、eval-defunの特別な機能は、変数の値がvoidかどうかテストせず、無条件に変数をセットする段取りをします(同じ機能はdefvarにも適用されます。Defining Global Variablesを参照してください)。すでに定義されたdefcustomでeval-defunを使用することにより、(もしあれば):set関数が呼び出されます(以下参照)。

事前ロード( pre-loaded)されたEmacs Lispファイル(Building Emacsを参照してください)にdefcustomを配した場合、ダンプ時にインストールされた標準値は正しくない — たとえば依存している他の変数は、まだ正しい値を割り当てられていない — かもしれません。この場合、Emacs起動後に標準値を再評価するために、以下で説明するcustom-reevaluate-settingを使用します。

Common Item Keywordsにリストされたキーワードに加え、このマクロには以下のキーワードを指定できます:

:type type

このオプションのデータ型として、typeを使用します。これはどんな値が適正なのか、その値をどのように表示するかを指定します(Customization Typesを参照してください)。

:options value-list

このオプションに使用する適正な値のリストを指定します。ユーザーが使用できる値はこれらの値に限定されませんが、これらは便利な候補値を提示します。

これは特定の型にたいしてだけ意味をもち、現在のところhookplistalistが含まれます。:optionsの使用法の説明は、個別の型の定義を参照してください。

:set setfunction

Customizeインターフェースを使用してこのオプションの値を変更する方法として、setfunctionを指定します。関数setfunctionは2つの引数 — シンボル(オプション名)と新しい値 — をとり、このオプションにたいして正しく値を更新するために必要なことは何であれ行うべきです(これはおそらくLisp変数として単にオプションをセットすることを意味しないでしょう)。望ましくは、この関数は引数の値を破壊的に変更するべきではありません。setfunctionのデフォルトは、set-defaultです。

このキーワードを指定した場合、その変数のドキュメント文字列には、手入力のLispコードで同じことを行う方法が記載されるべきです。

:get getfunction

このオプションの値を抽出する方法として、getfunctionを指定します。関数getfunctionは1つの引数(シンボル)をとり、カスタマイズがそのシンボル(シンボルのLisp値である必要はない)にたいする“カレント値”としてそれを使うべきかreturnするべきです。デフォルトはdefault-valueです。

:getを正しく使用するためには、Customの機能を真に理解する必要があります。これは変数としてCustom内で扱われる値のためのものですが、実際にはLisp変数に格納されません。実際にLisp変数に格納されている値にgetfunctionを指定するのは、ほとんどは誤りです。

:initialize function

functionは、defcustomが評価されるときに変数を初期化するために使用される関数であるべきです。これは2つの引数 — オプション名(シンボル)と値をとります。この方法での使用のために事前定義された関数がいくつかあります:

custom-initialize-set

変数の初期化に、その変数の:set関数を使用しますが、値がすでに非voidの場合、再処帰化を行いません。

custom-initialize-default

custom-initialize-setと同様ですが、その変数の:setのかわりに、関数set-defaultを使用して変数をセットします。これは変数の:set関数がマイナーモードを有効または無効にする場合の、通常の選択です。この選択により、変数の定義ではマイナーモード関数を呼び出しませんが、変数をカスタマイズしたときはマイナーモード関数を呼び出します。

custom-initialize-reset

変数の初期化に、常に:set関数を使用します。変数がすでに非voidの場合、(:getメソッドでreturnされる)カレント値を使用して:set関数を呼び出して変数をリセットします。これはデフォルトの:initialize関数です。

custom-initialize-changed

変数がすでにセットされている、またはカスタマイズされている場合は、変数の初期化のために:set関数を使用し、それ以外は単にset-defaultを使用します。

custom-initialize-safe-set
custom-initialize-safe-default

これらのn関数はcustom-initialize-setcustom-initialize-defaultと同様に振る舞いますが、エラーをcatchします。初期化中にエラーが発生した場合は、set-defaultを使用して変数をnilにセットして、エラーをシグナルしません。

これらの関数は事前ロードされたファイルで定義されたオプションのためのものです(requireされた変数または関数がまだ定義されていないため、standard式はエラーをシグナルするかもしれない)。その値は通常、startup.elで更新され、defcustomにより計算された値は無視されます。startup後に、その値をunsetして、defcustomを再評価すれば、エラーなしでstandardは評価されます。

:risky value

その変数のrisky-local-variableプロパティーをvalueにセットします(File Local Variablesを参照してください)。

:safe function

その変数のsafe-local-variableプロパティーを、functionにセットします(File Local Variablesを参照してください)。

:set-after variables

保存されたカスタマイズに合わせて変数をセッティングするときは、その前に変数variables確実にセット — つまり、これら他のものが処理される後までセッティングを遅延 — してください。これら他の変数が意図された値をもっていない場合に、この変数のセッティングが正しく機能しないときは、:set-afterを使用してください。

特定の機能を“オンに切り替える”オプションにたいしては、:requireキーワードを指定すると便利です。これは、その機能がまだロードされていないときは、そのオプションがセットされるとEmacsがその機能をロードするようにします。Common Item Keywordsを参照してください。以下はライブラリーsaveplace.elの例です:

(defcustom save-place nil
  "Non-nil means automatically save place in each file..."
  :type 'boolean
  :require 'saveplace
  :group 'save-place)

あるカスタマイズアイテムが、:optionsがサポートするhookalistのような型をもつ場合は、custom-add-frequent-valueを呼び出すことにより、defcustom宣言の外部から、別途値を追加できます。たとえばemacs-lisp-mode-hookから呼び出されることを意図した関数my-lisp-mode-initializationを定義する場合は、emacs-lisp-mode-hookにたいする正当な値として、その定義を編集することなく、その関数をリストに追加したいと思うかもしれません。これは以下のようにして行うことができます:

(custom-add-frequent-value 'emacs-lisp-mode-hook
   'my-lisp-mode-initialization)
Function: custom-add-frequent-value symbol value

カスタマイズオプションsymbolにたいして正当な値のリストにvalueを追加します。

追加による正確な効果は、symbolのカスタマイズ型に依存します。

内部的には、defcustomは、標準値にたいする式を記録するためにシンボルプロパティーstandard-valueを、カスタマイズバッファーでユーザーによりセットされたが保存されていない値を記録するためにsaved-valueを使用します。Symbol Propertiesを参照してください。これらのプロパティーは、carがその値を評価する式であるようなリストです。

Function: custom-reevaluate-setting symbol

この関数は、defcustomを通じて宣言されたユーザーオプションsymbolの標準値を再評価します。変数がカスタマイズされた場合、この関数はかわりに保存された値を再評価します。それからこの関数はユーザーオプションをその値に(もし定義されていればそのオプションの:setプロパティーを使用して)セットします。

これは値が正しく計算される前に定義されたカスタマイズ可能オプションにたいして有用です。たとえばstartupの間、Emacsは事前ロードされたEmacs Lispファイルで定義されたユーザーオプションにたいしてこの関数を呼び出しますが、これらの初期値は実行時だけ利用可能な情報に依存します。

Function: custom-variable-p arg

この関数は、argがカスタマイズ可能変数の場合は、非nilをreturnします。カスタマイズ可能変数とは、standard-valuecustom-autoloadプロパティーをもつ(通常はdefcustomで宣言されたことを意味する)変数、または別のカスタマイズ可能変数にたいするエイリアスのことです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4 Customization Types

defcustomでユーザーオプションを定義するときは、ユーザーオプションのカスタマイズ型(customization type)を指定しなければなりません。これは、(1)値が適正か、(2)編集のためにカスタマイズバッファーで値を表示する方法、を記述するLispオブジェクトです。

カスタマイズ型は、defcustom内の:typeキーワードで指定します。:typeの引数は評価されますが、defcustomが実行されるとき1回だけ評価されるので、さまざまな値をとる場合には有用でありません。通常はクォートされた定数を使用します。たとえば:

(defcustom diff-command "diff"
  "The command to use to run diff."
  :type '(string)
  :group 'diff)

一般的に、カスタマイズ型は、最初の要素が以降のセクションで定義されるカスタマイズ型の1つであるような、リストです。このシンボルの後にいくつかの引数があり、それはそのシンボルに依存します。型シンボルと引数の間には、オプションでkeyword-valueペアー(Type Keywordsを参照してください)を記述できます。

いくつかの型シンボルは引数を使用しません。これらはシンプル型(simple types)と呼ばれます。シンプル型にたいしては、keyword-valueペアーを使用しない場合は、型シンボルの周囲のカッコ(parentheses)を省略できます。たとえばカスタマイズ型として単にstringと記述すると、それは(string)と等価です。

すべてのカスタマイズ型はウィジェットとして実装されます。詳細は、Introduction in The Emacs Widget Libraryを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.1 Simple Types

このセクションでは、すべてのシンプルデータ型を説明します。これらのカスタマイズ型のうちのいくつかにたいして、カスタマイズウィジェットはC-M-iまたはM-TABによる、インライン補完を提供します。

sexp

値はプリントおよび読み込むことができる任意のLispオブジェクトです。より特化した型の使用するために時間をとりたくない場合は、任意のオプションへのフォールバックとしてsexpを使用することができます。

integer

値は整数でなければなりません。

number

値は数(浮動小数点数または整数)でなければなりません。

float

値は浮動小数点数でなければなりません。

string

値は文字列でなければなりません。カスタマイズバッファーはその文字列を区切り文字‘"’文字および‘\’クォートなしで表示します。

regexp

string文字と同様ですが、その文字列は有効な正規表現でなければなりません。

character

値は文字コードでなければなりません。文字コードは実際には整数ですが、この型は数字を表示せずに、バッファー内にその文字を挿入することにより値を表示します。

file

値はファイル名でなければなりません。ウィジェットは補完を提供します。

(file :must-match t)

値は既存のファイル名でなければなりません。ウィジェットは補完を提供します。

directory

値はディレクトリー名でなければなりません。ウィジェットは補完を提供します。

hook

値は関数のリストでなければなりません。このカスタマイズ型はフック変数にたいして使用されます。フック内での使用を推奨される関数のリストを指定するために、フック変数のdefcustom内で:optionsキーワードを使用できます。Defining Customization Variablesを参照してください。

symbol

値はシンボルでなければなりません。これはカスタマイズバッファー内でシンボル名として表示されます。ウィジェットは補完を提供します。

function

値はラムダ式か関数名でなければなりません。ウィジェットは関数名にたいする補完を提供します。

variable

値は変数名でなければなりません。ウィジェットは補完を提供します。

face

値はフェイス名のシンボルでなければなりません。ウィジェットは補完を提供します。

boolean

値は真偽値 — niltです。choiceconstを合わせて使用(次のセクションを参照)することにより、値がniltでなければならず、それぞれの値に固有の意味に適合する説明テキストを指定することもできます。

key-sequence

値はキーシーケンスです。カスタマイズバッファーは、kbd関数と同じ構文うぃ使用して、キーシーケンスを表示します。Key Sequencesを参照してください。

coding-system

値はコーディングシステム名でなければならず、M-TABで保管することができます。

color

値は有効なカラー名でなければなりません。ウィジェットはカラー名にたいする補完と、同様に*Colors*バッファーに表示されるカラーサンプルとカラー名のリストからカラー名を選択するボタンを提供します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.2 Composite Types

適切なシンプル型がないときは、複合型(composite types)を使うことができます。複合型は特定のデータによる他の型から、新しい型を構築します。指定された型またはデータは、その複合型の引数(argument)と呼ばれます。複合型は通常、以下のようなものです:

(constructor arguments…)

しかし、以下のように引数の前にkeyword-valueペアーを追加することもできます。

(constructor {keyword value}arguments…)

以下のテーブルに、はコンストラクター(constructor)と、複合型を記述するためにそれらを使用する方法を示します:

(cons car-type cdr-type)

値はコンスセルでなければならず、CARcar-typeCDRcdr-typeに適合していなければなりません。たとえば、(cons string symbol)は、("foo" . foo)のような値にマッチするデータ型です。

カスタマイズバッファーでは、CARCDRは、それぞれ特定のデータ型に応じて、別々に表示・編集されます。

(list element-types…)

値は、element-typesで与えられる要素と数が正確に一致するリストでなければならず、リストの各要素はそれぞれ対応するelement-typeに適合しなければなりません。

たとえば、(list integer string function)は、3つの要素のリストを示し、1つ目の要素は整数、2つ目の要素は文字列、3つ目の要素は関数です。

カスタマイズバッファーでは、各要素は、それぞれ特定のデータ型に応じて、別々に表示・編集されます。

(group element-types…)

これはlistと似ていますが、Customバッファー内でのテキストのフォーマットが異なります。listは各要素の値を、そのタグでラベルづけしますが、groupはそれを行いません。

(vector element-types…)

これはlistと似ていますが、リストではなくベクターでなければなりません。各要素はlistの場合と同様に機能します。

(alist :key-type key-type :value-type value-type)

値はコンスセルのリストでなければならず、各セルのCARはカスタマイズ型key-typeのキーを表し、同じセルのCDRはカスタマイズ型value-typeの値を表します。ユーザーはkey/valueペアーの追加や削除ができ、各ペアのキーと値の両方を編集することができます。

省略された場合、key-typevalue-typeのデフォルトは、sexpです。

ユーザーは指定されたkey-typeにマッチする任意のキーを追加できますが、:options(Defining Customization Variablesを参照してください)で指定することにより、あるキーを優先的に扱うことができます。指定されたキーは、(適切な値とともに)常にカスタマイズバッファーに表示されます。また、alistにkey/valueを含める、除外する、または無効にするかを指定するチェックボックスも一緒に表示されます。ユーザーは:optionsキーワード引数により指定された値は、変更できません。

:optionsキーワードにたいする引数は、alist内の適切なキーにたいする仕様のリストであるべきです。これらは通常、単純なアトムであり、それらは自身をを意味します。たとえば:

:options '("foo" "bar" "baz")

これは、名前が"foo""bar""baz"の、3つの“既知”のキーがあることを指定し、それらは常に最初に表示されます。

たとえば"bar"キーに対応する値を整数だけにするというように、特定のキーに対して値の型を制限したいときがあるかもしれません。これはリスト内でアトムのかわりにリストを使用することにより、指定することができます。前述のように、1つ目の要素はそのキーを指定し、2つ目の要素は値の型を指定します。たとえば:

:options '("foo" ("bar" integer) "baz")

最後に、キーが表示される方法を変更したいときもあるかもしれません。デフォルトでは、:optionsキーワードで指定された特別なキーはユーザーが変更できないので、キーは単にconstとして表示されます。しかし、たとえばそれが関数バインディングをもつシンボルだと知っている場合はfunction-itemといったように、あるキーの表示のために、より特化した型を使用したいと思うかもしれません。これは、キーに対してシンボルを使うかわりに、カスタマイズ型指定を使用することにより、行うことができます。

:options '("foo"
           ((function-item some-function) integer)
           "baz")

多くのalistは、コンスセルのかわりに2要素のリストを使用します。たとえば、

(defcustom cons-alist
  '(("foo" . 1) ("bar" . 2) ("baz" . 3))
  "Each element is a cons-cell (KEY . VALUE).")

のかわりに以下を使用します

(defcustom list-alist
  '(("foo" 1) ("bar" 2) ("baz" 3))
  "Each element is a list of the form (KEY VALUE).")

リストはコンスセルの最上位に実装されているため、上記のlist-alistを、コンスセルのalist(value-typeが実際の値を含む1要素のリストであるような)として扱うことができます。

(defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3))
  "Each element is a list of the form (KEY VALUE)."
  :type '(alist :value-type (group integer)))

listのかわりにgroupを使用するのは、その目的に適したフォーマットのためだけです。

同様に、以下のようなトリックの類を用いることにより、より多くの値が各キー連づけられたalistを得ることができます:

(defcustom person-data '(("brian"  50 t)
                         ("dorith" 55 nil)
                         ("ken"    52 t))
  "Alist of basic info about people.
Each element has the form (NAME AGE MALE-FLAG)."
  :type '(alist :value-type (group integer boolean)))
(plist :key-type key-type :value-type value-type)

このカスタマイズ型はalist(上位参照)と似ていますが、(1)情報がプロパティーリスト(Property Listsを参照してください)に格納され、(2)key-typeが省略された場合、デフォルトはsexpではなく、symbolになります。

(choice alternative-types…)

値はalternative-typesのうちの1つに適合しなければなりません。たとえば、(choice integer string)では整数か文字列が許されます。

カスタマイズバッファーでは、ユーザーはメニューを使用して候補を選択して、それらの候補にたいして通常の方法で値を編集できます。

通常この選択からメニューの文字列が自動的に決定されます。しかし候補の中に:tagキーワードを含めることにより、メニューにたいして異なる文字列を指定できます。たとえば、空白の数を意味する整数と、その通りに使用したいテキストにたいする文字列の場合は、以下のような方法でカスタマイズ型を記述したいかもしれません

(choice (integer :tag "Number of spaces")
        (string :tag "Literal text"))

この場合メニューは、‘Number of spaces’と‘Literal text’を提示します。

const以外のnilが有効な値ではない候補には、:valueキーワードを使用して、有効なデフォルト値を指定するべきです。Type Keywordsを参照してください。

複数の候補によりいくつかの値が提供される場合、カスタマイズは適合する値をもつ最初の候補を選択します。これは常に、もっとも特有な型を最初に、もっとも一般的な型を最後にリストすべきことを意味します。以下は適切な使い方の例です:

(choice (const :tag "Off" nil)
        symbol (sexp :tag "Other"))

この使い方では、特別な値nilはその他のシンボルとは別に扱われ、シンボルは他のLisp式とは別に扱われます。

(radio element-types…)

これはchoiceと似ていますが、選択はメニューではなく、‘ラジオボタン’で表示されます。これは該当する選択にたいしてドキュメントが表示できる利点があるので、関数定数(function-itemカスタマイズ型)の選択に適す場合があります。

(const value)

値はvalueでなければならず、他は許されません。

constは主にchoiceの中で使用されます。たとえば、(choice integer (const nil))では、整数かnilが選択できます。

choiceの中では、:tagとともにconstが使用される場合があります。たとえば、

(choice (const :tag "Yes" t)
        (const :tag "No" nil)
        (const :tag "Ask" foo))

これはtがyes、nilがno、fooが“ask”を意味することを示します。

(other value)

この候補は任意のLisp値にマッチできますが、ユーザーがこの候補を選択した場合は、値valueが選択されます。

otherは主にchoiceの最後の要素に使用されます。たとえば、

(choice (const :tag "Yes" t)
        (const :tag "No" nil)
        (other :tag "Ask" foo))

これはtがyes、nilがno、それ以外は“ask”を意味することを示します。ユーザーが候補メニューから‘Ask’を選択した場合は、値fooが指定されます。しかし、その他の値(tnilfooを除く)では、fooと同様に‘Ask’が表示されます。

(function-item function)

constと同様ですが、値が関数のときに使用されます。これはドキュメント文字列も関数名と同じように表示します。ドキュメント文字列は、:docで指定した文字列か、function自身のドキュメント文字列です。

(variable-item variable)

constと同様ですが、値が変数名のときに使用されます。これはドキュメント文字列も変数名と同じように表示します。ドキュメント文字列は、:docで指定した文字列か、variable自身のドキュメント文字列です。

(set types…)

値はリストでなければならず、指定されたtypesの1つにマッチしなければなりません。

これはカスタマイズバッファーではチェックリストとして表示されるので、typesはそれぞれ対応する要素を1つ、あるいは要素をもちません。同じ1つのtypesにマッチするような、異なる2つの要素を指定することはできません。たとえば、(set integer symbol)は、リスト内で1つの整数、および/または1つのシンボルが許され、複数の整数や複数のシンボルは許されません。結果として、set内でintegerのような特定的ではない型を使用するのは稀です。

以下のように、const型はset内のtypesでよく使用されます:

(set (const :bold) (const :italic))

alist内で利用できる要素を示すために使用されることもあります:

(set (cons :tag "Height" (const height) integer)
     (cons :tag "Width" (const width) integer))

これによりユーザーにオプションでheightとwidthの値を指定させることができます。

(repeat element-type)

値はリストでなければならず、リストの各要素は型element-typeに適合しなければなりません。カスタマイズバッファーでは要素のリストとして表示され、‘[INS]’および‘[DEL]’ボタンにより、要素の追加や削除が行われます。

(restricted-sexp :match-alternatives criteria)

これはもっとも汎用的な複合型の構築方法です。値はcriteriaを満足する任意のLispオブジェクトです。criteriaはリストで、リストの各要素は以下のうちの1つを満たす必要があります:

たとえば、

(restricted-sexp :match-alternatives
                 (integerp 't 'nil))

これは整数、tnilを正当な値として受け入れます。

カスタマイズバッファーは適切な値をそれらの入力構文ですべて表示し、ユーザーはこれらをテキストとして編集できます。

以下は複合型でキーワード/値ペアーとして使用できるキーワードのテーブルです:

:tag tag

tagは、ユーザーとのコミュニケーションのために、その候補の名前として使用される。choice内に出現する型にたいして有用。

:match-alternatives criteria

criteriaは可能な値とのマッチに使用されます。restricted-sexp内でのみ有用です。

:args argument-list

型構築の引数としてargument-listの要素を使用します。たとえば、(const :args (foo))(const foo)と等価です。明示的に:argsとく記述する必要があるのは稀です。なぜなら、最後のキーワード/値ペアーの後に続くものは何であれ、引数として認識されるからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.3 Splicing into Lists

:inline機能により、可変個の要素を、カスタマイズ型のlistvectorの途中にスプライス(splice: 継ぎ足す)することができます。listvector記述を含む型にたいして:inline tを追加することによりこれを使用します。

通常listvector型の仕様は、単一の要素型を表します。しかしエントリーが:inline tを含む場合、マッチする値は、その含まれたシーケンスに直接マージされます。たとえば、エントリーが3要素のリストにマッチする場合、全体が3要素のシーケンスになります。これはバッククォート構文(Backquoteを参照)の‘,@’に類似しています。

たとえば、最初の要素がbazで、残りの引数は0個以上のfoobarでなければならないリストを指定する場合は、以下のカスタマイズ型を使用します:

(list (const baz) (set :inline t (const foo) (const bar)))

これは (baz)(baz foo)(baz bar)(baz foo bar)のような値にマッチします。

要素の型がchoiceの場合は、choice自身の中で:inlineを使用せずに、choiceの候補(の一部)の中で使用します。たとえば、最初がファイル名で開始され、その後にシンボルtか2つの文字列を続けなければならないリストにマッチさせるには、以下のカスタマイズ型を使用します:

(list file
      (choice (const t)
              (list :inline t string string)))

選択においてユーザーが選択肢の1つ目を選んだ場合、リスト全体が2つの要素をもち、2つ目の要素はtになります。ユーザーが2つ目の候補を選んだ場合、リスト全体が3つの要素をもち、2つ目と3つ目の要素は文字列でなければなりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.4 Type Keywords

カスタマイズ型内の型名シンボルの後にキーワード/引数ペアーを指定できます。以下は使用できるキーワードと、それらの意味です:

:value default

デフォルト値を提供する。

その候補にたいしてnilが有効な値でない場合は、:valueに有効なデフォルトを指定することが必須になります。

choiceの内部の候補として出現する型にたいしてこれを使用する場合、ユーザーがカスタマイズバッファー内のメニューによりこの候補を選択したときに、使用するデフォルト値を最初に指定します。

もちろんオプションの実際の値がこの候補に適合する場合は、defaultではなく実際の値が表示されます。

:format format-string

この文字列は、その型に対応する値を説明するために、バッファーに挿入されます。format-string内では、以下の‘%’エスケープが利用できます:

%[button%]

ボタンとしてマークされたテキストbuttonを表示する。:action属性は、ユーザーがそれを呼び出したときに、そのボタンが何を行うか指定する。この属性の値は2つの引数 — ボタンが表示されるのでウィジェットとイベント — をとる関数。

異なるアクションを行う2つの異なるボタンを指定する方法はない。

%{sample%}

:sample-faceにより指定された、スペシャルフェイス内のsampleを表示する。

%v

そのアイテムの値を代替えする。その値がどのように表示されるかはアイテムの種類と、(カスタマイズ型にたいしては)カスタマイズ型にに依存する。

%d

そのアイテムのドキュメント文字列を代替えする。

%h

%d’と同様ふぁが、ドキュメント文字列が複数行の場合に、ドキュメント文字列全体か最初の行だけかを制御するボタンを追加する。

%t

その位置でタグに置き換える。:tagキーワードでタグを指定する。

%%

リテラル‘%’を表示する。

:action action

ユーザーがボタンをクリックした場合はactionを実行します。

:button-face face

%[…%]’で表示されたボタンテキストにたいして、フェイスface(フェイス名、またはフェイス名のリスト)を使用します。

:button-prefix prefix
:button-suffix suffix

これらはボタンの前、または後に表示されるテキストを指定します。以下が指定できます:

nil

テキストは挿入されない。

文字列

その文字列がリテラルに挿入される。

シンボル

そのシンボルの値が使用される。

:tag tag

この型に対応する値(または値の一部)にたいするタグとしてtag(文字列)を使用する。

:doc doc

この型に対応する値(または値の一部)にたいするドキュメント文字列としてdocを使用する。これが機能するためには、:formatにたいする値を指定し、その値にたいして‘%d’か‘%h’を使用しなければならない。

ある型にたいしてドキュメント文字列を指定するのは、:choice内の候補の型や、他の複合型の一部について情報を提供するのが通常の理由である。

:help-echo motion-doc

widget-forwardwidget-backwardでこのアイテムに移動したときに、エコーエリアに文字列motion-docを表示する。さらに、マウスのhelp-echo文字列としてmotion-docが使用され、これは実際にはヘルプ文字列を生成するために評価される関数またはフォームかもしれない。もし関数の場合、これは1つの引数(そのウィジェット)で呼び出される。

:match function

値がその型にマッチするか判断する方法を指定する。対応する値functionは、2つの引数(ウィジェットと値)をとる関数で、値が適切なら非nilをリターンすること。

:validate function

入力にたいして検証を行う関数を指定する。functionは引数としてウィジェットをとり、そのウィジェットのカレント値がウィジェットにたいして有効ならnilをリターンすること。それ以外は無効なデータを含むウィジェットをリターンして、そのウィジェットの:errorプロパティに、そのエラーを説明する文字列をセットすること。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.5 Defining New Types

前のセクションでは、defcustomにたいして型の詳細な仕様を作成する方法を説明しました。そのような型仕様に名前を与えたい場合があるかもしれません。理解しやすいケースとしては、多くのユーザーオプションに同じ型を使用する場合などです。各オプションにたいして仕様を繰り返すより、その型に名前を与えて、defcustomそれぞれにその名前を使用することができます。他にもユーザーオプションの値が再帰的なデータ構造のケースがあります。あるデータ型がそれ自身を参照できるようにするためには、それが名前をもつ必要があります。

カスタマイズ型はウィジェットとして実装されているめ、新しいカスタマイズ型を定義するには、新たにウィジェット型を定義します。ここではウィジェットインターフェイスの詳細は説明しません。Introduction in The Emacs Widget Libraryを参照してください。 かわりに、シンプルな例を用いて、カスタマイズ型を新たに定義するのに必要となる、最小限の機能について説明します。

(define-widget 'binary-tree-of-string 'lazy
  "A binary tree made of cons-cells and strings."
  :offset 4
  :tag "Node"
  :type '(choice (string :tag "Leaf" :value "")
                 (cons :tag "Interior"
                       :value ("" . "")
                       binary-tree-of-string
                       binary-tree-of-string)))

(defcustom foo-bar ""
  "Sample variable holding a binary tree of strings."
  :type 'binary-tree-of-string)

新しいウィジェットを定義するための関数は、define-widgetと呼ばれます。1つ目の引数は、新たなウィジェット型にしたいシンボルです。2つ目の引数は既存のウィジェットを表すシンボルで、新しいウィジェットではこの既存のウィジェットと異なる部分を定義することになります。新たなカスタマイズ型を定義する目的にたいしては、lazyウィジェットが最適です。なぜならこれは、defcustomにたいするキーワード引数と同じ構文、同じ名前でキーワード引数:typeを受け取るからです。3つ目の引数は、新しいウィジェットにたいするドキュメント文字列です。この文字列は、M-x widget-browse RET binary-tree-of-string RETコマンドで参照することができるようになります。

これらの必須の引数の後にキーワード引数が続きます。もっとも重要なのは:typeで、これはこのウィジェットにマッチさせたいデータ型を表します。上記の例ではbinary-tree-of-stringは文字列、またはcarとcdrがbinary-tree-of-stringであるようなコンスセルです。この定義中でのウィジェット型への参照に注意してください。:tag属性はユーザーインターフェイスでウィジェット名となる文字列、:offset引数はカスタマイズバッファーでのツリー構造の外観で,子ノードと関連する親ノードの間に4つのスペースを確保します。

defcustomは、通常のカスタマイズ型に使用される方法で新しいウィジェットを表示します。

lazyという名前の由来は、他のウィジェットの場合、それらがバッファーでインスタンス化されるとき、他の合成されたウィジェットが下位のウィジェットを内部形式に変換するからです。この変換は再帰的なので、下位のウィジェットは、それら自身の下位ウィジェットへと変換されます。データ構造自体が再帰的な場合、この変換は無限再帰(infinite recursion)となります。lazyウィジェットは、:type引数を必要なときだけ変換することにより、この再帰を防ぎます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.5 Applying Customizations

以下の関数には、変数とフェイスにたいして、そのユーザーのカスタマイズ設定をインストールる役目があります。それらの関数は、ユーザーがカスタマイズインターフェイスで‘Save for future sessions’を呼び出したときに、次回のEmacs起動時に評価されるようにcustom-set-variablesフォーム、および/またはcustom-set-facesフォームを がカスタムファイルに書き込まれることによって効果をもちます。

Function: custom-set-variables &rest args

この関数はargsにより指定された変数のカスタマイズをインストールします。args内の引数はそれぞれ、以下のようなフォームです

(var expression [now [request [comment]]])

varは変数名(シンボル)、expressionはカスタマイズされた値に評価される式です。

このcustom-set-variables呼び出しより前にvarにたいしてdefcustomフォームが評価された場合は、即座にexpressionが評価され、その変数の値にその結果がセットされます。それ以外は、その変数のsaved-valueプロパティにexpressionが格納され、これに関係するdefcustomが呼び出されたとき(通常はその変数を定義するライブラリーがEmacsにロードされたとき)に評価されます。

nowrequestcommentエントリーは内部的な使用に限られており、省略されるかもしれません。nowは、もし非nilの場合には、たとえその変数のdefcustomフォームが評価されていなくても、その変数の値がそのときセットされます。requestは即座にロードされる機能のリストです(Featuresを参照)。commentはそのカスタマイズを説明する文字列です。

Function: custom-set-faces &rest args

この関数はargsにより指定されたフェイスのカスタマイズをインストールします。args内の引数はそれぞれ、以下のようなフォームです

(face spec [now [comment]])

faceはフェイス名(シンボル)、specはそのフェイスにたいするカスタマイズされたフェイス仕様です(Defining Facesを参照)。

nowrequestcommentエントリーは内部的な使用に限られており、省略されるかもしれません。nowは、もし非nilの場合には、たとえdeffaceフォームが評価されていなくても、そのフェイス仕様がそのときセットされます。commentはそのカスタマイズを説明する文字列です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.6 Custom Themes

カスタムテーマ(Custom themes)とはユニットとして有効または無効にできるセッティングのコレクションです。Custom Themes in The GNU Emacs Manualを参照してくださいカスタムテーマはそれぞれEmacs Lispソースファイルにより定義され、それらはこのセクションで説明する慣習にしたがう必要があります。(カスタムファイルを手で記述するかわりに、カスタマイズ風のインターフェイスを使用して作成することもできます。Creating Custom Themes in The GNU Emacs Manualを参照してください。)

カスタムファイルはfoo-theme.elのように命名すべきです。ここでfooはテーマの名前です。このファイルでの最初のLispフォームはdefthemeの呼び出しで、最後のフォームはprovide-themeにすべきです。

Macro: deftheme theme &optional doc

このマクロはカスタムテーマの名前としてtheme(シンボル)を宣言します。オプション引数docは、そのテーマを説明する文字列であるべきです。この文字列はユーザーがdescribe-themeコマンドを呼び出したり、‘*Custom Themes*’バッファーで?をタイプしたときに表示されます。

2つの特別なテーマ名は禁止されています(それらを使用するとエラーになります)。userは、そのユーザーの直接的なカスタマイズ設定を格納するための“ダミー”のテーマです。そしchangedはカスタムシステムの外で行われた変更を格納するための“ダミー”のテーマです。

Macro: provide-theme theme

このマクロは完全に仕様が定められたテーマ名themeを宣言します。

defthemeprovide-themeの違いは、そのテーマセッティングを規定するLispフォーム(通常はcustom-theme-set-variablesの呼び出し、および/またはcustom-theme-set-facesの呼び出し)です。

Function: custom-theme-set-variables theme &rest args

この関数は、カスタムテーマthemeの変数のセッティングを規定します。themeはシンボルです。args内の各引数はフォームのリストです。

(var expression [now [request [comment]]])

ここでリストエントリーはcustom-set-variablesのときと同じ意味をもちます。Applying Customizationsを参照してください。

Function: custom-theme-set-faces theme &rest args

この関数は、カスタムテーマthemeのフェイスのセッティングを規定します。themeはシンボルです。args内の各引数はフォームのリストです。

(face spec [now [comment]])

ここでリストエントリーはcustom-set-facesのときと同じ意味をもちます。Applying Customizationsを参照してください。

原則的に、テーマファイルは他のLispフォームを含むこともでき、それらはそのテーマがロードされるときに評価されるでしょうが、これは“悪いフォーム”です。悪意のあるコードを含むテーマのロードを防ぐために、最初に非ビルトインテーマをロードする前に、Emacsはソースファイルを表示して、ユーザーにたいして確認を求めます。

以下の関数は、テーマをプログラム的に有効または無効にするのに有用です:

Function: custom-theme-p theme

この関数はtheme(シンボル)がカスタムテーマの名前の場合(たとえば、そのテーマが有効かどうかにかかわらず、カスタムテーマがEmacsにロードされていれば)、非nilをリターンします。それ以外はnilをリターンします。

Variable: custom-known-themes

この変数の値は、Emacsにロードされたテーマのリストです。テーマはそれぞれ、Lispシンボル(テーマ名)により表されます。この変数のデフォルト値は、2つの“ダミーテーマ”を含みます: (user changed)changedテーマには、カスタムテーマが適用される前に行われたセッティング(たとえばカスタムの外部での変数のセット)が格納されています。userテーマには、そのユーザーがカスタマイズして保存したセッティングが格納されています。defthemeマクロで宣言された任意の追加テーマは、このリストの先頭に追加されます。

Command: load-theme theme &optional no-confirm no-enable

この関数はthemeという名前のカスタムテーマを、変数custom-theme-load-pathで指定されたディレクトリーを探して、ソースファイルからロードします。Custom Themes in The GNU Emacs Manualを参照してください。また、そのテーマの変数とフェイスのセッティングが効果を及ぼすようにテーマをenablesにします(オプション引数no-enableが非nilでない場合)さらに、オプション引数no-confirmが非nilでない場合は、そのテーマをロードする前にユーザーに確認を求めます。

Command: enable-theme theme

この関数はthemeという名前のカスタムテーマを有効にします。そのようなテーマがロードされていない場合は、エラーをシグナルします。

Command: disable-theme theme

この関数はthemeという名前のカスタムテーマを無効にします。テーマはロードされたまま残りので、続けてenable-themeを呼び出せばテーマは再び有効になります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15 Loading

Lispコードのファイルをロードすることは、その内容をLispオブジェクト形式でLisp環境に取り込むことを意味します。Emacsはファイルを探してオープンし、テキストを読み込んで各フォームを評価してから、そのファイルをクローズします。そのようなファイルはLispライブラリー(Lisp library)とも呼ばれます。

eval-buffer関数がバッファー内のすべての式を評価するのと同様に、load関数はファイル内のすべての式を評価します。異なるのはEmacsバッファー内のテキストではなく、load関数はディスク上で見つかったファイル内のテキストを読み込み、評価することです。

ロードされたファイルは、ソースコードかバイトコンパイルされたコードとしてLisp式を含んでいなければなりません。このファイル内の各フォームは、トップレベルフォーム(top-level form)と呼ばれます。ロード可能なファイル内のフォームにたいする特別なフォーマットはありません。ファイル内のフォームはどれも、同じように直接バッファーにタイプされ、そこで評価されるでしょう(実際、ほとんどのコードはこの方法でテストされます)。多くの場合、そのフォームは関数定義と変数定義です。

外部ライブラリーのオンデマンドローディングについては、Dynamically Loaded Librariesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1 How Programs Do Loading

Emacs Lispにはロードのためのインターフェイスがいくつかあります。たとえば、autoloadはファイル内で定義された関数にたいしてプレースホルダーとなるオブジェクトを作成します。この関数はオートロードされる関数を呼び出すために、ファイルからその関数の実際の定義の取得を試みます(Autoloadを参照)。requireは、ファイルがまだロードされていない場合にファイルをロードします(Featuresを参照)。これらすべての関数は、処理を行うために最終的にloadを呼び出します。

Function: load filename &optional missing-ok nomessage nosuffix must-suffix

この関数はLispコードのファイルを見つけてオープンし、その中のすべてのフォームを評価して、そのファイルをクローズします。

ファイルを見つけるために、まずloadfilename.elcという名前、つまりfilenameに拡張子‘.elc’を足した名前のファイルを探します。このようなファイルが存在したら、それをロードします。その名前のファイルが存在しない場合、loadfilename.elという名前のファイルを探します。このファイルが存在したら、それをロードします。最後に、もしこれらの名前がどちらも見つからなかった場合、loadは何も付け足さないfilenameという名前のファイルを探して、それが存在したらロードします。(load関数にfilenameを認識する賢さはありません。foo.el.elのような正しくない名前のファイルの場合も、(load "foo.el")の評価によりそれを見つけてしまいます。)

Auto Compressionモードが有効(残念ながらデフォルトでは有効ですが)の場合、loadは他のファイル名を試みる前に圧縮されたバージョンのファイル名を探すので、ファイルを見つけることができません。圧縮されたファイルが存在したら、それを解凍してロードします。loadはファイル名にjka-compr-load-suffixes内の各サフィックスを足して、圧縮されたバージョンを探します。この変数の値は、文字列のリストでなければなりません。標準的な値は(".gz")です。

オプション引数nosuffixが非nilの場合loadはサフィックス‘.elc’と‘.el’を試みません。この場合、ロードしたいファイルの正確な名前を指定しなければなりません。ただしAuto Compressionモードが有効な場合には、loadは圧縮されたバージョンを探すために、jka-compr-load-suffixesを使用します。正確なファイル名の指定と、、nosuffixにたいしてtを使用することにより、foo.el.elのような名前のファイルにたいするロードの試みを抑止できます。

オプション引数must-suffixが非nilの場合、loadはロードに使用されるファイルの名前に明示的にディレクトリー名が含まれていなければ、ファイル名が‘.el’か‘.elc’で終わること(あるいは圧縮による拡張子が付加されているかもしれません)を要求します。

オプションload-prefer-newerが非nilの場合、loadはサフィックスを検索するとき、どのファイルであっても(‘.elc’、‘.el’など)、もっとも最近変更されたファイルのバージョンを選択します。

filenamefoobaz/foo.barのような相対ファイル名の場合、loadは変数load-pathを使用してそのファイルを探します。これはload-path内にリストされた各ディレクトリーにfilenameを追加して、最初に見つかったら名前のマッチするファイルをロードします。デフォルトディレクトリーを意味するnilload-pathで措定されたときだけ、カレントデフォルトディレクトリーを試みます。loadload-path内の最初のディレクトリーで利用可能な3つのサフィックスすべてを試行してから、2つ目のディレクトリーで3つのサフィックスすべてを試行する、というようにファイルを探します。Library Searchを参照してください。

最終的に見つかったファイル、およびEmacsがそのファイルを見つけたディレクトリーが何であれ、Emacsはそのファイル名を変数load-file-nameの値にセットします。

foo.elcfoo.elより古いと警告された場合、それはfoo.elのリコンパイルを考慮すべきことを意味します。Byte Compilationを参照してください

(コンパイルされていない)ソースファイルをロードしたとき、Emacsがファイルをvisitしたときと同じようにloadは文字セットの変換を行います。Coding Systemsを参照してください。

コンパイルされていないファイルをロードするとき、Emacsはそのファイルに含まれる任意のマクロ(Macrosを参照)を展開します。わたしたちはこれをeagerマクロ展開(eager macro expansion)と呼んでいます。(関連するコードを実行するまで展開を延期するのではなく)これを行うことにより、コンパイルされていないコード実行のスピードが明らかに向上します。このマクロ展開は、循環参照により行うことができないときもあります。これの一番簡単な例は、ロードしようとしているファイルが他のファイルで定義されているマクロを参照しているが、そのファイルはロードしようとしているファイルを必要としている場合です。これは一般的には無害です。Emacsは問題の詳細を与えるために警告(‘Eager macro-expansion skipped due to cycle…’)をプリントしますが、単にその時点ではマクロを展開せずに、そのファイルはロードされます。あなたはこの問題が発生しないように、コードをリストラクチャーしたいと思うかもしれません。コンパイル済みファイルでは、マクロ展開はコンパイル時に行われるので、ロード時のマクロ展開は行われません。Macros and Byte Compilationを参照してください。

nomessageが非nilでない場合は、ロードの間、エコーエリアに‘Loading foo...’や‘Loading foo...done’のようなメッセージが表示されます。

ファイルをロードする間のハンドルされないエラーは、ロードを終了させます。autoloadのためのロードの場合、ロードの間に定義された任意の関数定義は元に戻されます。

loadがロードするファイルを見つけられなかった場合、通常は(‘Cannot open load file filename’のメッセージとともに)エラーfile-errorがシグナルされます。しかしmissing-okが非nilの場合、loadは単にnilをリターンします。

式の読み取りにたいしてloadreadのかわりに使用する関数を指定するために、変数load-read-functionを使用できます。以下を参照してください。

ファイルが正常にロードされた場合、loadtをリターンします。

Command: load-file filename

このコマンドは、ファイルfilenameをロードします。filenameが相対ファイル名の場合は、カレントデフォルトディレクトリーとみなされます。このコマンドは、load-pathを使用せず、サフィックスの追加もしません。しかし、(Auto Compressionモードが有効な場合は)圧縮されたバージョンの検索を行います。ロードするファイル名を正確に指定したい場合は、このコマンドを使用してください。

Command: load-library library

このコマンドはlibraryという名前のライブラリーをロードします。このコマンドは、引数を読み取る方法がインタラクティブであることを除き、loadと同じです。Lisp Libraries in The GNU Emacs Manualを参照してください。

Variable: load-in-progress

この変数は、Emacsがファイルをロード中のときは非nil、それ以外はnilです。

Variable: load-file-name

このセクションの最初に説明した検索でEmacsがファイルを見つけて、そのファイルをロード中のとき、この変数の値はそのファイルの名前です。

Variable: load-read-function

この変数は、loadeval-regionが式の読み取るために、readのかわりに使用する関数を指定します。指定する関数はreadと同様、引数が1つの関数です。

通常、この変数の値はnilで、これはそれらの関数がreadを使用すべきことを意味します。

この変数を使用するかわりに、別の新たな方法を使用するほうが明確です。eval-regionread-function引数に、その関数を渡す方法です。Evalを参照してください。

Emacsのビルドでloadがどのように使用されているかについての情報は、Building Emacsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.2 Load Suffixes

ここでは、loadが試行するサフィックスについて、技術的な詳細を説明します。

Variable: load-suffixes

これは(ソースまたはコンパイル済みの)Emacs Lispファイルを示すサフィックスのリストです。空の文字列が含まれるべきではありません。loadは、指定されたファイル名にLispファイルのサフィックスを追加するときに、これらのサフィックスを使用します。標準的な値は(".elc" ".el")で、これは前のセクションで説明した振る舞いとなります。

Variable: load-file-rep-suffixes

これは同じファイルにたいする異なる表現を示すサフィックスのリストです。このリストは空の文字列から開始されるべきです。loadはファイルを検索するときは、他のファイルを検索する前にこのリストのサフィックスを順番にファイル名に追加します。

Auto Compressionモードを有効にすることによりjka-compr-load-suffixesのサフィックスがこのリストに追加され、無効にすると再びリストから取り除かれます。load-file-rep-suffixesの標準的な値は、Auto Compressionモードが無効な場合は("")です。jka-compr-load-suffixesの標準的な値が(".gz")であることを考慮すると、Auto Compressionモードが有効な場合のload-file-rep-suffixesの標準的な値は("" ".gz")です。

Function: get-load-suffixes

この関数は、must-suffix引数が非nilのときは、loadが試みるべきすべてのサフィックスを順番にしたがったリストでリターンします。この関数はload-suffixesload-file-rep-suffixesの両方を考慮に入れます。load-suffixesjka-compr-load-suffixesload-file-rep-suffixesがすべて標準的な値の場合、この関数はAuto Compressionモードが有効なら(".elc" ".elc.gz" ".el" ".el.gz")、無効なら(".elc" ".el")をリターンします。

まとめると、loadは通常まず(get-load-suffixes)の値のサフィックスを試み、つぎにload-file-rep-suffixesを試みます。nosuffixが非nilの場合は前者がスキップされ、must-suffixが非nilの場合は後者がスキップされます。

User Option: load-prefer-newer

このオプションが非nilの場合は、ファイルが見つかった最初のサフィックスで停止せずに、loadはすべてのサフィックスをテストして、一番新しいファイルを使用します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.3 Library Search

EmacsがLispライブラリーをロードするときは、変数load-path.<により指定されるディレクトリー内のライブラリーを検索します。

Variable: load-path

この変数の値は、loadでファイルをロードするとき検索するディレクトリーのリストです。リストの各要素は文字列(ディレクトリー名でなければなりません)、またはnil(カレントワーキングディレクトリーを意味します)です。

Emacsは起動時にいくつかのステップによりload-pathの値をセットアップします。最初に、Emacsがコンパイルされたときのデフォルトロケーションセット(default locations set)を使用して、load-pathを初期化します。通常これは以下のようなディレクトリーです

"/usr/local/share/emacs/version/lisp"

(以下の例では、あなたがインストールしたEmacsのインストールプレフィクスに合うように/usr/localを置き換えてください。)これらのディレクトリーには、Emacsとともにインストールされた、標準的なLispファイルが含まれます。Emacsがこれらを見つけられない場合は、正常に起動しないでしょう。

Emacsをビルドしたディレクトリーから起動した場合 −−− つまり正式にインストールされた実行形式ではないEmacsを起動した場合 — 、Emacsはビルドされたディレクトリーのソースのlispディレクトリーを使用してload-pathを初期化します。ソースとは別のディレクトリーでEmacsをビルドした場合は、ビルドしたディレクトリーのlispディレクトリーも追加します。(どちらの場合も、要素は絶対ファイル名になります。)

--no-site-lispオプションでEmacsを起動した場合を除き、load-pathの先頭に2つのさらにsite-lispを追加します。これらはローカルにインストールされたLispファイで、通常は:

"/usr/local/share/emacs/version/site-lisp"

"/usr/local/share/emacs/site-lisp"

の形式です。1つ目は特定のバージョンのEmacsにたいしてローカルにインストールされたものです。2つ目はインストールされたすべてのバージョンのEmacsが使用することを意図してローカルにインストールされたものです。(インストールされたものでないEmacsが実行された場合は、もし存在すればソースディレクトリーとビルドディレクトリーのsite-lispディレクトリーも追加します。これらのディレクトリーは通常、site-lispディレクトリーを含みません。)

環境変数EMACSLOADPATHがセットされている場合は、上述の初期化プロセスが変更されます。Emacsは、この環境変数の値にもとづいてload-pathを初期化します。

EMACSLOADPATHの構文は、PATHで使用される構文と同様です。ディレクトリー名は‘:’(オペレーティングシステムによっては‘;’)で区切られます。 以下は、(shスタイルのシェルから)EMACSLOADPATH変数をセットする例です:

export EMACSLOADPATH=/home/foo/.emacs.d/lisp:

環境変数の値内の空の要素は、(上記例のような)末尾、先頭、中間にあるかに関わらず、標準の初期化処理により決定されるload-pathのデフォルト値に置き換えられます。そのような空要素が存在しない場合には、EMACSLOADPATHによりload-path全体が指定されます。空要素、または標準のLispファイルを含むディレクトリーへの明示的なパスのどちらかを含めなければなりません。さもないとEmacsが関数を見つけられなくなります。(load-pathを変更する他の方法は、Emacs起動時にコマンドラインオプション-Lを使用する方法です。以下参照。)

load-path内の各ディレクトリーにたいし、Emacsはそのディレクトリーがファイルsubdirs.elを含むか確認し、もしあればそれをロードします。subdirs.elファイルは、load-pathのディレクトリーみたいして任意のサブディレクトリーを追加するためのコードが含まれており、Emacsがビルド/インストールされたとき作成されます。サブディレクトリーと複数階層下のレベルのサブディレクトリーの両方が、直接追加されます。ただし、名前の最初が英数字でないディレクトリー、名前がRCSまたはCVSのディレクトリー、名前が.nosearchというファイルを含むディレクトリーは除外されます。

Emacsは次に、コマンドラインオプション-L(Action Arguments in The GNU Emacs Manualを参照)で指定したロードディレクトリーを追加します。もしあれば、オプションパッケージ(Packaging Basicsを参照)がインストールされた場所も追加します。

initファイル(The Init Fileを参照)で、load-pathに1つ以上のディレクトリーを追加するコードを記述するのは一般的に行なわれています。たとえば:

(push "~/.emacs.d/lisp" load-path)

Emacsのダンプには、load-pathの特別な値を使用します。ダンプされたEmacsをカスタマイズするためにsite-load.elまたはsite-init.elを使用する場合、これらのファイルが行ったload-pathにたいする変更はすべて、ダンプ後失われます。

Command: locate-library library &optional nosuffix path interactive-call

このコマンドは、ライブラリーlibraryの正確なファイル名を探します。loadと同じ方法でライブラリーを検索し、引数nosuffixloadの場合と同じ意味です。libraryに指定する名前には、サフィックス‘.elc’または‘.el’を追加しないでください。

pathが非nilの場合は、load-pathのかわりにディレクトリーのリストが使用されます。

locate-libraryがプログラムから呼び出されたときは、ファイル名を文字列としてリターンします。ユーザーがインタラクティブにlocate-libraryを実行したときは、引数interactive-calltとなり、これはlocate-libraryにたいしてファイル名をエコーエリアに表示するよう指示します。

Command: list-load-path-shadows &optional stringp

このコマンドは、シャドー(shadowed)されたEmacs Lispファイルを表示します。シャドーされたファイルとは、load-pathのディレクトリーに存在するにも関わらず、load-pathのディレクトリーリスト内で前の位置にある他のディレクトリーに同じ名前のファイルが存在するため、通常はロードされないファイルのことです。

たとえば、以下のようにload-pathがセットされていたとします

  ("/opt/emacs/site-lisp" "/usr/share/emacs/23.3/lisp")

そして、両方のディレクトリーにfoo.elという名前のファイルがあるとします。この場合、(require 'foo)は決して2つ目のディレクトリーのファイルをロードしません。このような状況は、Emacsがインストールされた方法に問題があることを示唆します。

Lispから呼び出された場合、この関数はバッファー内に表示するかわりに、シャドーされたファイルリストのメッセージをプリントします。オプション引数stringpが非nilの場合は、かわりにシャドーされたファイルを文字列としてリターンします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.4 Loading Non-ASCII Characters

Emacs Lispプログラムが非ASCII文字の文字列定数を含むとき、Emacsではそれらをユニバイト文字列またはマルチバイト文字列のどちらかで表現される場合があります。どちらの表現が使用されるかは、そのファイルがどのようにEmacsに読み込まれたかに依存します。マルチバイト表現へのデコーディングとともに読み込まれた場合、Lispプログラム内のテキストはマルチバイトのテキストとなり、ファイル内の文字列定数はマルチバイト文字列になります。(たとえば)Latin-1文字を含むファイルをデコーディングなしで読み込んだ場合、そのプログラムのテキストはユニバイトのテキストとなり、ファイル内の文字列定数はユニバイト文字列になります。Coding Systemsを参照してください。

マルチバイト文字列がユニバイトバッファーに挿入されるときは自動的にユニバイトに変換されるため、大部分のEmacs Lispプログラムにおいて、マルチバイト文字列が非ASCII文字列であるという事実を意識させないようにすべきです。しかしこれが行われことにより違いが生じる場合には、ローカル変数セクションに‘coding: raw-text’と記述することにより、特定のLispファイルを強制的にユニバイトとして解釈させることができます。この識別子により、そのファイルは無条件でユニバイトとして解釈されます。これは、?vliteralで記述された非ASCII文字にキーバインドするとき重要になります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.5 Autoload

オートロード(autoload: 自動ロード)の機能により、定義されているファイルをロードすることなく、関数やマクロの存在を登録できます。関数の最初の呼び出しで、実際の定義およびその他の関連するコードをインストールするために適切なライブラリーを自動的にロードし、すべてがすでにロードされていたかのように、実際の定義を実行します。関数やマクロのドキュメントを参照することによっても、オートロードが発生します(Documentation Basicsを参照)。

オートロードされた関数をセットアップするには、2つの方法があります。それはautoloadを呼び出す方法と、ソースの実際の定義の前に、特別な“マジック”コメントを記述する方法です。autoloadはオートロードのための低レベルのプリミティブです。任意のLispプログラムが、任意のときにautoloadを呼び出すことができます。Emacsととみにインストールされるパッケージにとって、マジックコメントは関数をオートロードできるようににするための一番便利な方法です。コメント自身は何も行いませんが、コマンドupdate-file-autoloadsにたいするガイドを努めます。このコマンドはautoloadの呼び出しを構築し、Emacsビルド時に実行されるようアレンジします。

Function: autoload function filename &optional docstring interactive type

この関数は、filenameから自動的にロードされるように、functionという名前の関数(またはマクロ)を定義します。文字列filenameのは、functionの実際の定義を取得するファイルを指定します。

filenameがディレクトリー名とサフィックス.el.elcのどちらも含まない場合、この関数はこれらの強制的にサフィックスを追加します。つまりサフィックスが追加されないただのfilenameという名前のファイルはロードされません。(変数load-suffixesにより要求される正確なサフィックスが指定されます。)

引数docstringは、その関数のドキュメント文字列です。autoloadの呼び出しでドキュメント文字列を指定することにより、その関数の実際の定義をロードせずにドキュメントを見ることが可能になります。この引数の値は通常、関数定義のドキュメント文字列と等しくあるべきです。もし等しくない場合は、その関数のドキュメント文字列がロード時に有効になります。

interactiveが非nilの場合、その関数はインタラクティブに呼び出すことが可能になります。これにより、functionの実際の定義をロードせずに、M-xによる補完が機能するようになります。。ここでは、完全なインタラクティブ指定は与えられません。完全な指定はユーザーが実際にfunctionを呼び出すまで必要ありません。実際にユーザーが呼び出したときに、実際の定義がロードされます。

普通の関数と同様、マクロおよびキーマップをオートロードできます。functionが実際にはマクロの場合はtypemacroを指定し、キーマップの場合にはtypekeymapを指定します。Emacsのさまざまな部分は、実際の定義をロードせずに、これらの情報を知る必要があるのです。

オートロードされたキーマップは、あるプレフィクスキーがシンボルfunctionにバインドされているときにキーを探す間に、自動的にロードされます。そのキーマップにたいする他の類のアクセスでは、オートロードは発生しません。特に、Lispプログラムが変数の値からそのキーマップを取得してdefine-keyを呼び出した場合には、たとえその変数の名前がシンボルfunctionと同じであっても、オートロードは起こりません。

functionが非voidのオートロードされたオブジェクトではない関数定義をもつ場合、その関数は何も行わずnilをリターンします。それ以外は、オートロードされたオブジェクト(Autoload Typeを参照)を作成して、それをfunctionにたいする関数定義として格納します。オートロードされたオブジェクトは、以下の形式をもちます:

(autoload filename docstring interactive type)

たとえば、

(symbol-function 'run-prolog)
     ⇒ (autoload "prolog" 169681 t nil)

このような場合、"prolog"はロードするファイルの名前、169681はemacs/etc/DOCファイル(Documentation Basicsを参照)内のドキュメント文字列への参照で、tはその関数がインタラクティブであり、nilはそれがマクロやキーマップでないことを意味します。

Function: autoloadp object

この関数は、objectがオートロードされたオブジェクトの場合、非nilをリターンします。たとえば、run-prologがオートロードされたオブジェクトかチェックするには、以下を評価します

(autoloadp (symbol-function 'run-prolog))

オートロードされたファイルは、通常は他の定義を含み、1つ以上の機能を必要あるいは提供するかもしれません。(内容の評価でのエラーにより)そのファイルが完全にロードされていない場合、そのロードの間に行われた関数定義やprovideの呼び出しはアンドゥされます。これは、このファイルからオートロードされる関数にたいして再度呼び出しを試みたときに、そのファイルを確実に再ロードさせるためです。このようにしないと、そのファイル内のいくつかの関数はアボートしたロードにより定義されていて、それらはロードされなかった修正後のファイルで提供される正しいサブルーチンを欠くため、正しく機能しないからです。

オートロードされたファイルが意図したLisp関数、またはマクロの定義に失敗した場合には、データ"Autoloading failed to define function function-name"とともにエラーがシグナルされます。

オートロードのマジックコメント(autoload cookieとも呼ばれる)は、オートロード可能なソースファイル内の実際の定義の直前にある、‘;;;###autoload’だけの行から構成されます。コマンドM-x update-file-autoloadsは、対応するautoload呼び出しをloaddefs.el内に書き込みます。(autoload cookieとなる文字列と、update-file-autoloadsにより生成されるファイルの名前は、上述のデフォルトから変更可能です。以下を参照。) Emacsのビルドではloaddefs.elをロードするためにautoloadを呼び出します。M-x update-directory-autoloadsは、より強力です。このコマンドはカレントディレクトリー内のすべてのファイルにたいするオートロードを更新します。

このマジックコメントは、任意の種類のフォームを、loaddefs.el内にコピーできます。このマジックコメントに続くフォームは、そのままコピーされます。しかしオートロード機能が特別に処理するフォームの場合は除外されます(たとえばautoload内への変換)。以下は、そのままコピーされないフォームです:

関数、または関数のようなオブジェクトにたいする定義:

defundefmacrocl-defuncl-defmacro(Argument Lists in Common Lisp Extensionsを参照)、およびdefine-overloadable-function (mode-local.el内のコメントを参照)も該当

メジャーモードおよびマイナーモードにたいする定義:

define-minor-modedefine-globalized-minor-modedefine-generic-modedefine-derived-modeeasy-mmode-define-minor-modeeasy-mmode-define-global-modedefine-compilation-modedefine-global-minor-mode

その他のタイプの定義:

defcustomdefgroupdefclass (EIEIO in EIEIOを参照)、およびdefine-skeleton (skeleton.el内のコメントを参照)。

ビルド時に、そのファイル自身をロードするときにフォームを実行しないように、マジックコメントを使用することもできます。これを行なうには、マジックコメントと同じ行にフォームを記述します。これはコメントなので、ソースファイルをロードするとき何も行いません。ただしM-x update-file-autoloadsは、Emacsビルド時に実行されたものは、M-x update-file-autoloadsにコピーします。

以下は、マジックコメントによるオートロードのためにdoctorを準備する例です:

;;;###autoload
(defun doctor ()
  "Switch to *doctor* buffer and start giving psychotherapy."
  (interactive)
  (switch-to-buffer "*doctor*")
  (doctor-mode))

これにより、以下がloaddefs.el内に書き込まれます:

(autoload (quote doctor) "doctor" "\
Switch to *doctor* buffer and start giving psychotherapy.

\(fn)" t nil)

ダブルクォートの直後のバックスラッシュまたは改行は、loaddefs.elのようなプリロードされた未コンパイルだけに使用される慣習です。これは、make-docfileにたいして、ドキュメント文字列をetc/DOCファイルに配するよう指示します。Building Emacsを参照してください。また、lib-src/make-docfile.c内のコメントも参照してください。ドキュメント文字列の使い方(usage part)の中の‘(fn)’は、種々のヘルプ関数(Help Functionsを参照)が表示するとき、その関数の名前に置き換えられます。

関数定義手法として既知ではなく、認められてもいないような、通常とは異なるマクロにより関数定義を記述した場合、通常のオートロードのマジックコメントの使用により、定義全体がloaddefs.el内にコピーされるでしょう。これは期待した動作ではありません。かわりに以下を記述することにより、意図したautoload呼び出しをloaddefs.el内に配することができます。

;;;###autoload (autoload 'foo "myfile")
(mydefunmacro foo
  ...)

autoload cookieとして、デフォルト以外の文字列を使用して、デフォルトのloaddefs.elとは異なるファイル内に、対応するオートロード呼び出しを記述できます。これを制御するために、Emacsは2つの変数を提供します:

Variable: generate-autoload-cookie

この変数の値は、Lispコメントの文法に準じた文字列です。M-x update-file-autoloadsは、そのcookieの後のLispフォームを、cookieが生成したオートロードファイル内にコピーします。この変数のデフォルト値は、";;;###autoload"です。

Variable: generated-autoload-file

この変数の値は、オートロード呼び出しが書き込まれるEmacs Lispファイルを命名します。デフォルト値はloaddefs.elですが、(たとえば.elファイル内のセクション“Local Variables”))をオーバーライドできます。オートロードファイルは、フォームフィード文字で開始される終端を含んでいると仮定されます。

以下の関数は、オートロードオブジェクトにより指定されたライブラリーを明示的にロードするために使用されるかもしれません:

Function: autoload-do-load autoload &optional name macro-only

この関数はオートロードオブジェクトautoloadにより指定されたロードを処理します。オプション引数nameに非nilを指定する場合は、関数値がautoloadとなるシンボルを指定します。この場合、この関数のリターン値は、そのシンボルの新しい関数値になります。オプション引数macro-onlyの値がmacroの場合、この関数は関数ではなくマクロのロードだけを有効にします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.6 Repeated Loading

1つのEmacsセッション内で、ファイルを複数回ロードできます。たとえば、バッファーで関数定義を編集して再インストールした後に、元のバージョンに戻したいときがあるかもしれません。これは、元のファイルをリロードすることにより行なうことができます。

ファイルをロードまたはリロードするとき、loadおよびload-library関数は未コンパイルのファイルではなく、バイトコンパイルされた同名のファイルを自動的にロードすることに留意してください。ファイルを再記述して保存後に再インストールする場合には、新しいバージョンをバイトコンパイルする必要があります。さもないと、Emacsは新しいソースではなく、古いバイトコンパイルされたファイルをロードしてしまうでしょう! その場合には、ファイルロード時に表示されるメッセージに、そのファイルのリコンパイルを促す‘(compiled; note, source is newer)’というメッセージが含まれます。

Lispライブラリーファイル内にフォームを記述するときは、そのファイルが複数回ロードされるかもしれないことに留意してください。たとえば、そのライブラリーをリロードするときには、各変数が最初期化されるべきかどうか考慮してください。。変数がすでに初期化されている場合、defvarはその変数の値を変更しません(Defining Global Variablesを参照)。

alistに要素を追加するもっともシンプルな方法は、以下のようなものでしょう:

(push '(leif-mode " Leif") minor-mode-alist)

しかし、これはそのライブラリーがリロードされた場合は、複数の要素を追加してしまうでしょう。この問題を避けるには、add-to-list(Modifying List Variablesを参照)を使用します:

(add-to-list 'minor-mode-alist '(leif-mode " Leif"))

時には、ライブラリーが既にロード済みか、明示的にテストしたいときがあるでしょう。そのライブラリーがprovideを使用して名前付きフィーチャ(named feature)を提供する場合は、featurepを使用して前にprovideが実行されているかテストすることができます。かわりに、以下のようにすることもできます:

(defvar foo-was-loaded nil)

(unless foo-was-loaded
  execute-first-time-only
  (setq foo-was-loaded t))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.7 Features

providerequireは、autoloadにかわるファイルを自動的にロードする関数です。これらは名前付きのフィーチャ(feature: 機能)という面で機能します。オートロードは特定の関数の呼び出しをトリガーにしますが、フィーチャーは最初は他のプログラムが名前により問い合わせたときにロードされます。

フィーチャ名とは、関数、変数などのコレクションを表すシンボルです。これらを定義するファイルは、そのフィーチャをプロバイド(provide: 提供)すべきです。これらのフィーチャを使用する他のプログラムは、その機能をリクワイア(require: 要求)することにより、それらが定義されているか確認できるでしょう。これは、定義がまだロードされていなければ、定義ファイルをロードします。

フィーチャをリクワイアするには、フィーチャ名を引数としてrequireを呼び出します。requireは、意図する機能がすでにプロバイドされているか確認するために、グローバル変数featuresを調べます。もしプロバイドされていなければ、適切なファイルからそのフィーチャをロードします。このファイルは、そのフィーチャをfeaturesに追加するために、トップレベルでprovideを呼び出すべきです。これに失敗すると、requireはエラーをシグナルします。

たとえば、idlwave.el内のidlwave-complete-filenameにたいする定義には、以下のコードが含まれます:

(defun idlwave-complete-filename ()
  "Use the comint stuff to complete a file name."
   (require 'comint)
   (let* ((comint-file-name-chars "~/A-Za-z0-9+@:_.$#%={}\\-")
          (comint-completion-addsuffix nil)
          ...)
       (comint-dynamic-complete-filename)))

(require 'comint)は、comint.elがまだロードされていなければ、comint-dynamic-complete-filenameが確実に定義されるように、そのファイルをロードします。フィーチャは通常、それらを提供するファイルにしたがって命名されるため、requireにファイル名を与える必要はありません。(require命令文がletのボディーの外側にあるのが重要なことに注意してください。変数がletバインドされているライブラリーをロードすることにより、意図せぬ結果、つまりletをexitした後にその変数がアンバインドされます。)

comint.elには以下のトップレベル式が含まれます:

(provide 'comint)

これはcomintはグローバルなリストfeaturesに追加するので、(require 'comint)は今後何も行う必要がないことを知ることができます。

ファイルのトップレベルrequireが使用されたときは、それをロードしたときと同様、そのファイルをバイトコンパイル(Byte Compilationを参照)したときにも効果が表れます。これはリクワイアされたパッケージがマクロを含み、バイトコンパイラーがそれを知らなければならない場合です。これはrequireによりロードされるファイルで定義される関数と変数にたいするバイトコンパイラーの警告も無効にします。

バイトコンパイルの間にトップレベルのrequireが評価されるとしても、provide呼び出しは評価されません。したがって、以下の例のようにprovideの後に同じ機能にたいするrequireを含めることにより、バイトコンパイル前に定義しているファイルを確実にロードできます。

(provide 'my-feature)  ; バイトコンパイラーには無視され、
                       ;   loadには評価される。
(require 'my-feature)  ; バイトコンパイラーにより評価される。

コンパイラーはprovideを無視して、その後に対象のファイルをロードすることによりrequireが処理されます。ファイルのロードはprovide呼び出しを実行するので、後続のrequireはファイルがロードされているときは何も行いません。

Function: provide feature &optional subfeatures

この関数は、カレントEmacsセッションにfeatureがロードされた、あるいはロードされつつあることをアナウンスします。これは、featureに関連する機能が他のLispプログラムから利用可能できる、あるいは利用可能になることを意味します。

provideを呼び出すことによる直接的な効果は、まだfeaturefeatures内に存在しない場合はリストの先頭に追加して、それを必要としているeval-after-loadコードを呼び出します(Hooks for Loadingを参照)。引数featureはシンボルでなければなりません。providefeatureをリターンします。

subfeaturesが与えられた場合、それはfeatureの当該バージョンによりプロバイドされる特定のサブフィーチャのセットを示すシンボルのリストであるべきです。featurepを使用して、サブフィーチャの存在をテストできます。あるパッケージの、ロードされるか、あるいはそのバージョンに存在するか不明なさまざまな部分や機能に名前を与えて使いやすくするには、そのパッケージが複雑すぎるときにサブフィーチャを使用するというのがサブフィーチャというアイデアです。例としては、Testing Availability of Network Featuresを参照してください。

features
     ⇒ (bar bish)

(provide 'foo)
     ⇒ foo
features
     ⇒ (foo bar bish)

オートロードによりあるファイルがロードされて、その内容の評価エラーによりストップいたとき、そのロードの間に発生した関数定義やprovide呼び出しはアンドゥされます。Autoloadを参照してください。

Function: require feature &optional filename noerror

この関数はカレントEmacsセッションにおいて、featureが存在するかどうかを、((featurep feature)を使用して。以下を参照)をチェックします。引数featureはシンボルでなければなりません。

そのフィーチャが存在しない場合、requireloadによりfilenameをロードします。filenameが与えられなかった場合は、シンボルfeatureの名前がロードするファイル名のベースとして使用されます。しかしこの場合、requirefeatureを探すためにサフィックス‘.el’および‘.elc’の追加を強制します(圧縮ファイルのサフィックスに拡張されるかもしれません)。名前がただのfeatureというファイルは使用されません。(変数load-suffixesは要求されるLispサフィックスを正確に指定します。)

noerrorが非nilの場合は、ファイルの実際のロードにおけるエラーを抑止します。この場合、そのファイルのロードが失敗すると、requirenilをリターンします。通常では、requirefeatureをリターンします。

ファイルのロードは成功したがfeatureをプロバイドしていない場合、requireは‘Required feature feature was not provided’のようにエラーをシグナルします。

Function: featurep feature &optional subfeature

この関数は、カレントEmacsセッションfeatureがプロバイドされている場合(たとえばfeaturefeaturesのメンバーの場合)はtをリターンします。subfeatureが非nilの場合、この関数はサブフィーチャも同様にプロバイドされているとき(たとえばsubfeatureがシンボルfeatureのプロパティsubfeatureのメンバーのとき)だけtをリターンします。

Variable: features

この変数の値はシンボルのリストで、このシンボルはカレントEmacsセッションにロードされたフィーチャです。シンボルはそれぞれprovideを呼び出すことにより、このリストにputされたものです。リストfeatures内の要素の順番に意味はありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.8 Which File Defined a Certain Symbol

Function: symbol-file symbol &optional type

この関数は、symbolを定義しているファイルの名前をリターンします。typenilの場合は、どのようなタイプの定義も受け入れられます。typedefunの場合は関数定義、defvarは変数定義、deffaceはフェイス定義だけを指定します。

値は通常、絶対ファイル名です。定義がどのファイルにも関係しないときは、nilになることもあります。symbolがオートロード関数を指定する場合、値が拡張子なしの相対ファイル名になることもあります。

symbol-fileは変数load-history.<の値にもとづいています。

Variable: load-history

この変数の値は、ロードされたライブラリーファイルの名前を、それらが定義する関数と変数の名前、およびそれらがプロバイドまたはリクワイアするフィーチャに関連付けるalistです。

このalist内の各要素は、1つのロード済みライブラリー(スタートアップ時にプリロードされたライブラリーを含む)を記述します。要素はCARがライブラリーの絶対ファイル名(文字列)のリストです。残りのリスト要素は、以下の形式です:

var

シンボルvarが変数として定義された。

(defun . fun)

関数funが定義された。

(t . fun)

関数funは、このライブラリーがそれを関数として再定義する前はオートロードとして定義されていた。後続の要素は常に(defun . fun)で、これはfunを関数として定義する。

(autoload . fun)

関数funはオートロードとして定義された。

(defface . face)

フェイスfaceが定義された。

(require . feature)

フィーチャfeatureがリクワイアされた。

(provide . feature)

フィーチャfeatureがプロバイドされた。

load-historyの値には、CARnilの要素が1つ含まれるかもしれません。この要素は、ファイルをvisitしていないバッファーでのeval-bufferで作成された定義を記述します。

コマンドeval-regionload-historyを更新しますが、要素を置き換えずに、visitされているファイルの要素にたいして定義されたシンボルを追加します。Evalを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.9 Unloading

他のLispオブジェクト用にメモリーを回収するために、ライブラリーによりロードされた関数や変数を破棄することができます。これを行うには、関数unload-featureを使用します:

Command: unload-feature feature &optional force

このコマンドはフィーチャfeatureをプロバイドしていたライブラリーをアンロードします。そのライブラリー内のdefundefaliasdefsubstdefmacrodefconstdefvardefcustomにより定義されたすべての関数、マクロ、変数は未定義になります。その後、それらのシンボルにたいして事前に関連付けられていたオートロードをリストアします。(ロードはシンボルのautoloadプロパティにこれらを保存しています。)

以前の定義をリストアする前に、特定のフックからそのライブラリー内の関数を取り除くために、unload-featureremove-hookを実行します。これらのフックには、名前が‘-hook’(または廃止されたサフィックス‘-hooks’)で終わる変数、加えてunload-feature-special-hooks、同様にauto-mode-alistにリストされた変数も含まれます。これは、重要なフックがすでに定義されていない関数を参照をすることにより、Emacsの機能が停止することを防ぐためです。

標準的なアンロードアクティビティは、そのライブラリー内の関数のELPプロファイリングを取り消し、そのライブラリーによりプロバイドされたフィーチャを取り消し、そのライブラリーで定義された変数に保持されたタイマーも取り消します。

これらの基準が機能不全を防ぐのに十分でない場合、ライブラリーはfeature-unload-functionという名前の明示的なアンローダーを定義できます。そのシンボルが関数として定義された場合、unload-featureは何かを行う前にまず引数なしでそれを呼び出します。これはライブラリーをアンロードしるために適切なすべてのことを行うことができます。これがnilをリターンした場合、unload-featureは通常のアンロードアクションを処理します。それ以外は、アンロード処理は完了したとみなします。

unload-featureは通常、他のライブラリーが依存するライブラリーのアンロードを拒絶します。(ライブラリーbにたいするrequireがライブラリーaに含まれる場合、abに依存します。)オプション引数forceが非nilの場合、依存関係は無視され、どのようなライブラリーもアンロードできます。

unload-feature関数はLispで記述されており、その動作は変数load-historyにもとづきます。

Variable: unload-feature-special-hooks

この変数には、ライブラリー内で定義された関数を取り除くために、ライブラリーをアンロードする前にスキャンされるフックのリストが保持されています。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.10 Hooks for Loading

変数after-load-functionsを使用することにより、Emacsがライブラリーをロードするたびにコードを実行させることができます:

Variable: after-load-functions

このアブノーマルフック(abnormal hook)は、ファイルをロードした後に実行されます。フック内の各関数は1つの引数(ロードされたファイルの絶対ファイル名)で呼び出されます。

特定のライブラリーがロードされた後にコードを実行したい場合は、マクロwith-eval-after-loadを使用します:

Macro: with-eval-after-load library body…

このマクロはlibraryがロードされるたびに、ファイルlibraryのロードの最後でbodyが評価されるよう準備します。libraryがすでにロード済みの場合は、即座にbodyを評価します。

ファイル名libraryにディレクトリーや拡張子を与える必要はありません。通常は以下のようにファイル名だけを与えます:

(with-eval-after-load "edebug" (def-edebug-spec c-point t))

どのファイルが評価をトリガーできるか制限するには、ディレクトリーか拡張子、またはしの両方をlibraryに含めます。実際のファイル名(たとえばすべてのシンボリックリンク名は除外される)が、与えられた名前すべてにマッチするファイルだけが、マッチします。以下の例では、どこかのディレクトリー..../foo/barにあるmy_inst.elcmy_inst.elc.gzは評価をトリガーしますが、my_inst.elは異なります。:

(with-eval-after-load "foo/bar/my_inst.elc" …)

libraryはフィーチャ(たとえばシンボル)でもよく、その場合(provide library)を呼び出す任意のファイルの最後にbodyが評価されます。

body内のエラーはロードをアンドゥしませんが、bodyの残りの実行を妨げます。

上手く設計されたLispプログラムは通常、eval-after-loadを使用するべきではありません。(外部からの使用を意図した)他のライブラリーで定義された変数を調べたりセットする必要がある場合、それは即座に行うことができます −−− そのライブラリーがロードされるのを待つ必要はありません。そのライブラリーで定義された関数を呼び出す必要がある場合は、そのライブラリーをロードすべきで、それにはrequire(Featuresを参照)が適しています。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16 Byte Compilation

Emacs Lispには、Lispで記述された関数を、より効率的に実行できるバイトコード(byte-code)と呼ばれる特別な表現に翻訳するコンパイラー(compiler)があります。コンパイラーはLispの関数定義をバイトコードに置き換えます。バイトコード関数が呼び出されたとき、その定義はバイトコードインタープリター(byte-code interpreter)により評価されます。

バイトコンパイルされたコードは、(本当のコンパイル済みコードのように)そのマシンのハードウェアにより直接実行されるのではなく、バイトコンパイラーにより評価されるため、バイトコードはリコンパイルしなくてもマシン間での完全な可搬性を有します。しかし、本当にコンパイルされたコードほど高速ではありません。

一般的に、任意のバージョンのEmacsはそれ以前のバージョンのEmacsにより生成されたバイトコンパイル済みコードを実行できますが、逆は成り立ちません。

あるLispファイルを常にコンパイルせずに実行したい場合は、以下のようにno-byte-compileにバインドするファイルローカル変数を配します:

;; -*-no-byte-compile: t; -*-

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.1 Performance of Byte-Compiled Code

バイトコンパイルされた関数はCで記述されたプリミティブ関数ほど効率的ではありませんがLispで記述されたバージョンよりは高速に実行されます。以下は例です:

(defun silly-loop (n)
  "Return the time, in seconds, to run N iterations of a loop."
  (let ((t1 (float-time)))
    (while (> (setq n (1- n)) 0))
    (- (float-time) t1)))
⇒ silly-loop
(silly-loop 50000000)
⇒ 10.235304117202759
(byte-compile 'silly-loop)
⇒ [コンパイルされたコードは表示されない]
(silly-loop 50000000)
⇒ 3.705854892730713

この例では、インタープリターによる実行には10秒を要しますが、バイトコンパイルされたコードは4秒未満です。これは典型的な結果例ですが、実際の結果はさまざまでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.2 Byte-Compilation Functions

byte-compileにより、関数やマクロを個別にバイトコンパイルできます。byte-compile-fileでファイル全体、byte-recompile-directoryまたはbatch-byte-compileで複数ファイルをコンパイルできます。

バイトコンパイラーが警告、および/またはエラーメッセージを生成することもあります(詳細はCompiler Errorsを参照)。これらのメッセージはCompilationモードが使用する*Compile-Log*と呼ばれるバッファーに記録されます。Compilation Mode in The GNU Emacs Manualを参照してください。

バイトコンパイルを意図したファイル内にマクロ呼び出しを記述する際は、注意が必要です。マクロ呼び出しはコンパイル時に展開されるので、そのマクロはEmacsにロードされる必要があります(さもないとバイトコンパイラーは正しく処理しないでしょう)。これを処理する通常の方法は、必要なマクロ定義を含むファイルをrequireフォームで指定することです。バイトコンパイラーは通常、コンパイルするコードを評価しませんが、requireフォームは指定されたライブラリーをロードすることにより特別に扱われます。誰かがコンパイルされたプログラムを実行する際に、マクロ定義ファイルのロードを回避するには、require呼び出しの周囲にeval-when-compileを記述します(Evaluation During Compilationを参照)。詳細はMacros and Byte Compilationを参照してください。

インライン(defsubst)の関数は、これほど面倒ではありません。定義が判明する前にそのような関数呼び出しをコンパイルした場合でも、その呼び出しは低速になるだけで、正しく機能するでしょう。

Function: byte-compile symbol

この関数はsymbolの関数定義をバイトコンパイルして、以前の定義をコンパイルされた定義に置き換えます。symbolの関数定義は、その関数にたいする実際のコードでなければなりません。byte-compileはインダイレクト関数を処理しません。リターン値は、symbolのコンパイルされた定義であるバイトコード関数ブジェクトです(Byte-Code Function Objectsを参照)。

(defun factorial (integer)
  "INTEGERの階乗を計算する。"
  (if (= 1 integer) 1
    (* integer (factorial (1- integer)))))
⇒ factorial
(byte-compile 'factorial)
⇒
#[(integer)
  "^H\301U\203^H^@\301\207\302^H\303^HS!\"\207"
  [integer 1 * factorial]
  4 "Compute factorial of INTEGER."]

symbolの定義がバイトコード関数オブジェクトの場合、byte-compileは何も行わずnilをリターンします。そのシンボルの関数セル内の(コンパイルされていない)オリジナルのコードはすでにバイトコンパイルされたコードに置き換えられているので、“シンボルの定義の再コンパイル”はしません。

byte-compileの引数としてlambda式も指定できます。この場合、関数は対応するコンパイル済みコードをリターンしますが、それはどこにも格納されません。

Command: compile-defun &optional arg

このコマンドはポイントを含むdefunを読み取りそれをコンパイルして、結果を評価します。実際に関数定義であるようなdefunでこれを使用した場合は、その関数のコンパイル済みバージョンをインストールする効果があります。

compile-defunは通常、評価した結果をエコーエリアに表示しますが、argが非nilの場合は、そのフォームをコンパイルした後にカレントバッファーに結果を挿入します。

Command: byte-compile-file filename &optional load

この関数はfilenameという名前のLispコードファイルを、バイトコードのファイルにコンパイルします。出力となるファイルの名前は、サフィックス‘.el’を‘.elc’に変更することにより作成されます。filenameが‘.el’で終了しない場合は、‘.elc’をfilenameの最後に付け足します。

コンパイルは入力ファイルから1つのフォームを逐次読み取ることにより機能します。フォームが関数またはマクロの場合は、コンパイル済みの関数またはマクロが書き込まれます。それ以外のフォームはまとめられて、まとめられたものごとにコンパイルされ、そのファイルが読まれたとき実行されるようにコンパイルされたコードが書き込まれます。入力ファイルを読み取る際、すべてのコメントは無視されます。

このコマンドはエラーのないときはt、それ以外はnilをリターンします。インタラクティブに呼び出されたときは、ファイル名の入力をもとめます。

loadが非nilの場合、このコマンドはコンパイルした後にコンパイルされたファイルをロードします。インタラクティブに呼び出された場合、loadはプレフィクス引数です。

$ ls -l push*
-rw-r--r-- 1 lewis lewis 791 Oct  5 20:31 push.el
(byte-compile-file "~/emacs/push.el")
     ⇒ t
$ ls -l push*
-rw-r--r-- 1 lewis lewis 791 Oct  5 20:31 push.el
-rw-rw-rw- 1 lewis lewis 638 Oct  8 20:25 push.elc
Command: byte-recompile-directory directory &optional flag force

このコマンドは、directory(またはそのサブディレクトリー)内の、リコンパイルを要するすべての‘.el’ファイルをリコンパイルします。‘.elc’ファイルが存在し、それが‘.el’より古いファイルは、リコンパイルが必要です。

.el’ファイルに対応する‘.elc’ファイルが存在しない場合、何を行うかをflagで指定します。nilの場合、このコマンドはこれらのファイルを無視します。flagが0のときは、それらをコンパイルします。nilと0以外の場合は、それらのファイルをコンパイルするかユーザーに尋ね、同様にそれぞれのサブディレクトリーについても尋ねます。

インタラクティブに呼び出された場合、byte-recompile-directorydirectoryの入力を求め、flagはプレフィクス引数になります。

forceが非nilの場合、このコマンドは‘.elc’ファイルのあるすべての‘.el’ファイルをリコンパイルします。

リターン値は不定です。

Function: batch-byte-compile &optional noforce

この関数は、コマンドラインで指定されたファイルにたいして、byte-compile-fileを実行します。この関数は処理が完了するとEmacsをkillするので、Emacsのバッチ実行だけで使用しなければなりません。1つのファイルでエラーが発生しても、それにより後続のファイルにたいする処理が妨げられることはありませんが、そのファイルにたいする出力ファイルは生成されず、Emacsプロセスは0以外のステータスコードで終了します。

noforceが非nilの場合、この関数は最新の‘.elc’ファイルがあるファイルをリコンパイルしません。

$ emacs -batch -f batch-byte-compile *.el

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.3 Documentation Strings and Compilation

Emacsがバイトコンパイルされたファイルから関数や変数をロードする際、通常はメモリー内にそれらのドキュメント文字列をロードしません。それぞれのドキュメント文字列は、必要なときだけバイトコンパイルされたファイルから“ダイナミック(dynamic: 動的)”にロードされます。ドキュメント文字列の処理をスキップすることにより、メモリーが節約され、ロードが高速になります。

この機能には欠点があります。コンパイル済みのファイルを削除、移動、または(新しいバージョンのコンパイル等で)変更した場合、Emacsは前にロードされた関数や変数のドキュメント文字列にアクセスできなくなるでしょう。このような問題は通常、あなた自身がEmacsをビルドした場合に、そのLispファイルを編集、および/またはリコンパイルしたときだけ発生します。この問題は、リコンパイル後にそれぞれのファイルをリロードするだけで解決します。

バイトコンパイルされたファイルからのドキュメント文字列のダイナミックロードは、バイトコンパイルされたファイルごとに、コンパイル時に決定されます。これはオプションbyte-compile-dynamic-docstringsにより、無効にできます。

User Option: byte-compile-dynamic-docstrings

これが非nilの場合、バイトコンパイラーはドキュメント文字列をダイナミックロードするようセットアップしたコンパイル済みファイルを生成します。

特定のファイルでダイナミックロード機能を無効にするには、以下のようにヘッダー行(Local Variables in Files in The GNU Emacs Manualを参照)で、このオプションにnilをセットします。

-*-byte-compile-dynamic-docstrings: nil;-*-

これは主に、あるファイルを変更しようとしていて、そのファイルをすでにロード済みのEmacsセッションがファイルを変更した際にも正しく機能し続けることを望む場合に有用です。

内部的には、ドキュメント文字列のダイナミックロードは、特殊なLispリーダー構成‘#@count’とともにコンパイル済みファイルに書き込むことにより達成されます。この構成は、次のcount文字をスキップします。さらに‘#$’構成も使用され、これは“このファイルの名前(文字列)”を意味します。これらの構成をLispソースファイル内で使用しないでください。これらは人間がファイルを読む際に明確であるようデザインされていません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.4 Dynamic Loading of Individual Functions

ファイルをコンパイルするとき、オプションでダイナミック関数ロード(dynamic function loading)機能(laxyロード(lazy loading)とも呼ばれる)を有効にできます。ダイナミック関数ロードでは、ファイルのロードでファイル内の関数定義は完全には読み込まれません。かわりに、各関数定義にはそのファイルを参照するプレースホルダーが含まれます。それぞれ関数が最初に呼び出されるときに、そのプレースホルダーを置き換えるために、ファイルから完全な定義が読み込まれます。

ダイナミック関数ロードの利点は、ファイルのロードがより高速になることです。ユーザーが呼び出せる関数を多く含むファイルにとって、それらの関数のうち1つを使用したら、おそらく残りの関数も使用するというのでなければ、これは利点です。多くのキーボードコマンドを提供する特化したモードは、このパターンの使い方をする場合があります。ユーザーはそのモードを呼び出すかもしれませんが、使用するのはそのモードが提供するコマンドのわずか一部です。

ダイナミックロード機能には、いくつか不利な点があります:

このような問題は、通常の状況でインストールされたEmacsファイルでは決して発生しません。しかし、あなたが変更したLispファイルでは発生し得ます。それぞれのファイルをリコンパイルしたらすぐに、新たなコンパイル済みファイルをリロードするのが、これらの問題を回避する一番簡単な方法です。

コンパイル時に変数byte-compile-dynamicが非nilの場合、バイトコンパイラーはダイナミック関数ロード機能を使用します。ダイナミックロードが望ましいのは特定のファイルにたいしてだけなので、この変数をグローバルにセットしないでください。そのかわりに、特定のソースファイルのファイルローカル変数で、この機能を有効にしてください。たとえば、ソースファイルの最初の行に以下のテキストを記述することにより、これを行うことができます:

-*-byte-compile-dynamic: t;-*-
Variable: byte-compile-dynamic

これが非nilの場合、バイトコンパイラーはダイナミック関数ロードのためにセットアップされたコンパイル済みファイルを生成します。

Function: fetch-bytecode function

functionがバイトコード関数オブジェクトの場合、それがまだ完全にロードされていなければ、バイトコンパイル済みのファイルからのfunctionのバイトコードのロードを完了させます。それ以外は、何も行いません。この関数は、常にfunctionをリターンします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.5 Evaluation During Compilation

これらの機能により、プログラムのコンパイル中に評価されるコードを記述できます。

Special Form: eval-and-compile body…

このフォームは、それを含むコードがコンパイルされるとき、および(コンパイルされているかいないかに関わらず)実行されるときの両方で、bodyが評価されるようにマークします。

bodyを別のファイルに配し、そのファイルをrequireで参照すれば、同様の結果が得られます。これはbodyが大きいとき望ましい方法です。事実上、requireは自動的にeval-and-compileされ、そのパッケージはコンパイル時と実行時の両方でロードされます。

autoloadも実際はeval-and-compileされます。これはコンパイル時に認識されるので、そのような関数の使用により警告“not known to be defined”は生成されません。

ほとんどのeval-and-compileの使用は、完全に妥当であると言えます。

あるマクロがマクロの結果を構築するためのヘルパー関数をもち、そのマクロがそのパッケージにたいしてローカルと外部の両方で使用される場合には、コンパイル時と後の実行時にそのヘルパー関数を取得するために、eval-and-compileを使用すべきです。

関数がプログラム的に(fsetで)定義されている場合には、それがコンパイル時、同様に実行時に行われるように使用でき、それらの関数への呼び出しはチェックされます(“not known to be defined”の警告は抑えられます)。

Special Form: eval-when-compile body…

このフォームは、bodyがコンパイル時に評価され、コンパイルされたプログラムがロードされるときは評価されないようにマークします。コンパイラーによる評価の結果は、コンパイル済みのプログラム内の定数となります。ソースファイルをコンパイルではなくロードした場合、bodyは通常どおり評価されます。

生成するために何らかの計算が必要な定数がある場合、eval-when-compileはコンパイル時にそれを行なうことができます。たとえば、

(defvar my-regexp
  (eval-when-compile (regexp-opt '("aaa" "aba" "abb"))))

他のパッケージを使用しているが、そのパッケージのマクロ(バイトコンパイラーはそれらを展開します)だけが必要な場合、それらを実行せずにコンパイル用にロードさせるためにeval-when-compileを使用できます。たとえば、

(eval-when-compile
  (require 'my-macro-package))

これらの事項は、マクロおよびdefsubst関数がローカルに定義され、そのファイル内だけで使用されることを要求します。これらは、そのファイルのコンパイルに必要ですが、コンパイル済みファイルの実行には、ほとんどの場合必要ありません。たとえば、

(eval-when-compile
  (unless (fboundp 'some-new-thing)
    (defmacro 'some-new-thing ()
      (compatibility code))))

これは大抵他のバージョンのEmacsとの互換性にたいする保証だけのためのコードにたいして有用です。

Common Lispに関する注意: トップレベルでは、eval-when-compileはCommon Lispのイディオム(eval-when (compile eval) …)に類似しています。トップレベル以外では、Common Lispのリーダーマクロ‘#.’(ただし解釈時を除く)が、eval-when-compileと近いことを行います。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.6 Compiler Errors

バイトコンパイルのエラーメッセージと警告メッセージは、*Compile-Log*という名前のバッファーにプリントされます。これらのメッセージには、問題となる箇所を示すファイル名と行番号が含まれます。これらのメッセージにたいして、コンパイラー出力を操作する通常のEmacsコマンドが使用できます。

あるエラーがプログラムのシンタックスに由来する場合、バイトコンパイラーはエラーの正確な位置の取得に際し混乱するかもしれません。バッファー *Compiler Input*.にスイッチするのは、これを調べ1つの方法です。(このバッファー名はスペースで始まるので、Buffer Menuに表示されません。)このバッファーにはコンパイルされたプログラムと、バイトコンパイラーが読み取れた箇所からポイントがどれほど離れているかが含まれ、エラーの原因はその近傍にあるかもしれません。シンタックスエラーを見つけるヒントについては、Debugging Invalid Lisp Syntaxを参照してください。

定義されていない関数や変数の使用は、バイトコンパイラーにより報告される警告のタイプとしては一般的です。そのような警告では、定義されていない関数や変数を使用した位置ではなく、そのファイルの最後の行の行番号が報告されるので、それを見つけるには手作業で検索しなければなりません。

定義のない関数や変数の警告が間違いだと確信できる場合には、警告を抑制する方法がいくつかあります:

with-no-warnings構成を使用して特定の式にたいするコンパイラーのすべての任意の警告を抑制することもできます:

Special Form: with-no-warnings body…

実行時には〜これは(progn body...)と等価ですが、コンパイラーはbodyの中で起こるいかなる事項にたいしても警告を発しません。

わたしたちは、あなたが抑制したいと意図する警告以外の警告を失わないようにするために、可能な限り小さいコード断片にたいしてこの構成を使用することを推奨します。

変数byte-compile-warningsをセットすることにより、コンパイラーの警告をより詳細に制御できます。詳細は、変数のドキュメント文字列を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.7 Byte-Code Function Objects

バイトコンパイルされた関数は、特別なデータ型、バイトコード関数オブジェクト(byte-code function objects)をもちます。関数呼び出しとしてそのようなオブジェクトが出現したとき、Emacsはそのバイトコードを実行するために、常にバイトコードインタープリターを使用します。

内部的には、バイトコード関数オブジェクトはベクターによく似ています。バイトコード関数オブジェクトの要素には、arefを通じてアクセスできます。バイトコード関数オブジェクトのプリント表現(printed representation)はベクターに似ていて、開き‘[’の前に‘#’が追加されます。バイト関数オブジェクトは少なくとも4つの要素をもたねばならず、要素数に上限はありません。しかし通常使用されるのは、最初の6要素です。これらは:

arglist

シンボル引数のリスト。

byte-code

バイトコード命令を含む文字列。

constants

バイトコードにより参照されるLispオブジェクトのベクター。関数名と変数名に使用されるシンボルが含まれる。

stacksize

この関数が要するスタックの最大サイズ。

docstring

(もしあれば)ドキュメント文字列。それ以外はnil。ドキュメント文字列がファイルに格納されている場合、値は数字かリストかもしれない。本当のドキュメント文字列の取得には、関数documentationを使用する(Access to Documentation Stringsを参照)。

interactive

(もしあれば)インタラクティブ仕様。文字列かLisp式。インタラクティブでない関数ではnil

以下は、バイトコード関数オブジェクトのプリント表現の例です。これはコマンドbackward-sexpの定義です。

#[(&optional arg)
  "^H\204^F^@\301^P\302^H[!\207"
  [arg 1 forward-sexp]
  2
  254435
  "^p"]

バイトコードオブジェクトを作成する原始的な方法は、make-byte-codeです:

Function: make-byte-code &rest elements

この関数はelementsを要素とするバイトコードオブジェクトを構築して、リターンします。

あなた自身が要素を収集してバイトコード関数を構築しないでください。それらが矛盾する場合、その関数の呼び出しによりEmacsがクラッシュするかもしれません。これらのオブジェクトの作成は、常にバイトコンパイラーにまかせてください。バイトコンパイラーは、要素を矛盾なく構築します(願わくば)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.8 Disassembled Byte-Code

人はバイトコードを記述しません。それはバイトコンパイラーの仕事です。しかし、好奇心を満たすために、わたしたちはディスアセンブラを提供しています。ディスアセンブラは、バイトコードを人間が読めるフォームに変換します。

バイトコードインタープリターは、シンプルなスタックマシンとして実装されています。これは値を自身のスタックにpushして、計算で使用するためにそれらをpopして取り出し、おの結果を再びそのスタックにpushして戻します。バイトコード関数がリターンするときは、スタックから値をpopして取り出し、その関数の値としてリターンします。

それに加えてスタックとバイトコード関数は、値を変数とスタックの間で転送することにより、普通のLisp変数を使用したり、バインドおよびセットすることができます。

Command: disassemble object &optional buffer-or-name

このコマンドは、objectにたいするディスアセンブルされたコードを表示します。インタラクティブに使用した場合、またはbuffer-or-namenilか省略された場合は、*Disassemble*という名前のバッファーに出力します。buffer-or-nameが非nilの場合は、バッファーもしくは既存のバッファーの名前でなければなりません。その場合は、そのバッファーのポイント位置に出力され、ポイントは出力の前に残りされます。

引数objectには関数名、ラムダ式(Lambda Expressionsを参照)、またはバイトコードオブジェクト(Byte-Code Function Objectsを参照)を指定できます。ラムダ式の場合、disassembleはそれをコンパイルしてから、そのコンパイル済みコードをディスアセンブルします。

以下にdisassemble関数を使用した例を2つ示します。バイトコードとLispソースを関連付ける助けとなるように、説明的なコメントを追加してあります。これらのコメントは、disassembleの出力にはありません。

(defun factorial (integer)
  "Compute factorial of an integer."
  (if (= 1 integer) 1
    (* integer (factorial (1- integer)))))
     ⇒ factorial
(factorial 4)
     ⇒ 24
(disassemble 'factorial)
     -| byte-code for factorial:
 doc: Compute factorial of an integer.
 args: (integer)
0   varref   integer      ; integerの値を取得して
                          ;   それをスタック上にpushする。
1   constant 1            ; スタック上に1をpushする。
2   eqlsign               ; 2つの値をスタックからpopして取り出し、
                          ;   それらを比較して結果をスタック上にpushする。
3   goto-if-nil 1         ; スタックのトップをpopしてテストする。
                          ;   nilなら1へ、それ以外はcontinue。
6   constant 1            ; スタックのトップに1をpushする。
7   return                ; スタックのトップの要素をリターンする。
8:1 varref   integer      ; integerの値をスタック上にpushする。
9   constant factorial    ; factorialをスタック上にpushする。
10  varref   integer      ; integerの値をスタック上にpushする。
11  sub1                  ; integerをpopして値をデクリメントする。
                          ;   スタック上に新しい値をpushする。
12  call     1            ; スタックの最初(トップ)の要素を引数として
                          ;   関数factorialを呼び出す。
                          ;   リターン値をスタック上にpushする。
13 mult                   ; スタックのトップ2要素をpopして取り出し乗じ
                          ;   結果をスタック上にpushする。
14 return                 ; スタックのトップ要素をリターンする。

silly-loopは幾分複雑です:

(defun silly-loop (n)
  "Return time before and after N iterations of a loop."
  (let ((t1 (current-time-string)))
    (while (> (setq n (1- n))
              0))
    (list t1 (current-time-string))))
     ⇒ silly-loop
(disassemble 'silly-loop)
     -| byte-code for silly-loop:
 doc: Return time before and after N iterations of a loop.
 args: (n)
0   constant current-time-string  ; current-time-string
                                  ;   スタック上のトップにpushする。
1   call     0            ; 引数なしでcurrent-time-stringを呼び出し
                          ;   結果をスタック上にpushする。
2   varbind  t1           ; スタックをpopしてt1にpopされた値をバインドする。
3:1 varref   n            ; 環境からnの値を取得して
                          ;   その値をスタック上にpushする。
4   sub1                  ; スタックのトップから1を減ずる。
5   dup                   ; スタックのトップを複製する。
                          ;   たとえばスタックのトップをコピーしてスタック上にpushする。
6   varset   n            ; スタックのトップをpopして
                          ;   nをその値にバインドする。

;; (要はシーケンスdup varsetはpopせずに
;;  スタックのトップをnの値にコピーする。)
7   constant 0            ; スタック上に0をpushする。
8   gtr                   ; スタックのトップ2値をpopして取り出し
                          ;   nが0より大かテストし
                          ;   結果をスタック上にpushする。
9   goto-if-not-nil 1     ; n > 0なら1へ
                          ;   (これはwhile-loopを継続する)
                          ;   それ以外はcontinue。
12  varref   t1           ; t1の値をスタック上にpushする。
13  constant current-time-string  ; current-time-string
                                  ;   スタックのトップにpushする。
14  call     0            ; 再度current-time-stringを呼び出す。
15  unbind   1            ; ローカル環境のt1をアンバインドする。
16  list2                 ; スタックのトップ2要素をpopして取り出し
                          ;   それらのリストを作りスタック上にpushする。
17  return                ; スタックのトップの値をリターンする。

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17 Debugging Lisp Programs

Emacs Lispプログラム内の問題を見つけて詳細に調べる方法が、いくつかあります。

入出力の問題をデバックする便利なその他のツールに、ドリブルファイル(dribble file: Terminal Inputを参照)と、open-termscript関数(Terminal Output)があります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1 The Lisp Debugger

普通のLispデバッガは、フォーム評価のサスペンド機能を提供します。評価がサスペンド(一般的にはbreakの状態として知られる)されている間、実行時スタックを調べたり、ローカル変数やグローバル変数の値を調べたり変更することができます。breakは再帰編集(recursive edit)なので、Emacsの通常の編集機能が利用可能です。デバッガにエンターするようにプログラムを実行することさえ可能です。Recursive Editingを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.1 Entering the Debugger on an Error

デバッガに入る一番重要なタイミングは、Lispエラーが発生したときです。デバッガでは、エラーの直接原因を調査できます。

しかしデバッガへのエンターは、エラーによる通常の結末ではありません。多くのコマンドは不適切に呼び出されたときにLispエラーをシグナルするので、通常の編集の間にこれが発生するたびデバッガにエンターするのは、とても不便でしょう。したがって、エラーの際にデバッガにエンターしたい場合は、変数debug-on-errorに非nilをセットします。(コマンドtoggle-debug-on-errorは、これを簡単に行う方法を提供します。)

User Option: debug-on-error

この変数はエラーがシグナルされ、それがハンドルされていないときに、デバッガが呼び出されるかどうかを決定します。debug-on-errortの場合は、debug-ignored-errors(以下を参照)にリストされているエラーを除く、すべての種類のエラーがデバッガを呼び出します。nilの場合は、デバッガを呼び出しません。

値にはエラー条件(How to Signal an Errorを参照)のリストも指定できます。その場合、このリスト内のエラー条件だけにより、デバッガが呼び出されます(debug-ignored-errorsにもリストされているエラー条件は除外されます)。たとえば、debug-on-errorをリスト(void-variable)にセットした場合には、値をもたない変数に関するエラーにたいしてだけデバッガが呼び出されます。

eval-expression-debug-on-errorがこの変数をオーバーライドする場合がいくつかあることに注意してください(以下を参照)。

この変数が非nilのとき、Emacsはプロセスフィルター関数と番兵(sentinel)の周囲にエラーハンドラーを作成しません。したがって、これらの関数内でのエラーは、デバッガを呼び出します。Processesを参照してください。

User Option: debug-ignored-errors

この変数は、debug-on-errorの値に関わらず、デバッガにエンターすべきでないエラーを指定します。変数の値はエラー条件のシンボル、および/または正規表現のリストです。エラーがこれら条件シンボルのいずれか、またはエラーメッセージが正規表現のいずれかにマッチする場合、そのエラーはデバッガにエンターしません。

この変数の通常の値にはuser-errorと、同様に編集中にしばしば発生するがLispプログラムのバグによるものはほとんどない、いくつかのエラーが含まれます。しかし、“ほとんどない”は“絶対ない”ではありません。あなたのプログラムがこのリストにマッチするエラーにより機能しない場合は、そのエラーをデバッグするために、このリストの変更を試みるのもよいでしょう。通常はdebug-ignored-errorsnilにセットしておくのが、もっとも簡単な方法です。

User Option: eval-expression-debug-on-error

この変数が非nil値(デフォルト)の場合は、コマンドeval-expressionの実行により、一時的にdebug-on-errortがバインドされます。Evaluating Emacs-Lisp Expressions in The GNU Emacs Manualを参照してください。

eval-expression-debug-on-errornilの場合は、eval-expressionの間もdebug-on-errorの値は変更されません。

Variable: debug-on-signal

condition-caseによりキャッチされたエラーは通常、決してデバッガを呼び出しません。condition-caseは、デバッガがそのエラーをハンドルする前に、エラーをハンドルする機会を得ます。

debug-on-signalを非nil値に変更した場合は、condition-caseの存在如何に関わらず、すべてのエラーにおいてデバッガが最初に機会を得ます。(デバッガを呼び出すためには、依然としてそのエラーがdebug-on-errordebug-ignored-errorsで指定された条件を満たさなければなりません。)

警告: この変数を非nilにセットすると、芳しくない効果があるかもしれません。Emacsのさまざまな部分で処理の通常の過程としてエラーがキャッチされており、そのエラーが発生したことに気づかないことさえあるかもしれません。condition-caseでラップされたコードをデバッグする必要がある場合は、condition-case-unless-debug(see section Writing Code to Handle Errorsを参照)の使用を考慮してください。

User Option: debug-on-event

debug-on-eventをスペシャルイベント(Special Eventsを参照)にセットした場合は、Emacsはspecial-event-mapをバイパスして、このイベントを受け取ると即座にデバッガへのエンターを試みます。現在のところサポートされる値は、シグナルSIGUSR1およびSIGUSR2に対応する値だけです(これがデフォルトです)。これはinhibit-quitがセットされていて、それ以外はEmacsが応答しない場合に有用かもしれません。

Variable: debug-on-message

debug-on-messageに正規表現をセットした場合には、それにマッチするメッセージがエコーエリアに表示されると、Emacsはデバッガにエンターします。たとえば、これは特定のメッセージの原因を探すのに有用かもしれません。

initファイルロード中に発生したエラーをデバッグするには、オプション‘--debug-init’を使用します。これはinitファイルロードの間にdebug-on-errortにバインドして、通常はinitファイル内のエラーをキャッチするcondition-caseをバイパスします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.2 Debugging Infinite Loops

プログラムが無限にループしてリターンできないとき、最初の問題はそのループをいかに停止するかです。ほとんどのオペレーティングシステムでは、(quitさせる)C-gでこれを行うことができます。Quittingを参照してください。

普通のquitでは、なぜそのプログラムがループしたかについての情報は与えられません。変数debug-on-quitに非nilをセットすることにより、より多くの情報を得ることができます。無限ループの途中でデバッガを実行すれば、デバッガからステップコマンドで先へ進むことができます。ループ全体をステップで追えば、問題を解決するために十分な情報が得られるでしょう。

C-gによるquitはエラーとは判断されないので、C-gのハンドルにdebug-on-errorは効果がありません。同じように、debug-on-quitはエラーにたいして効果がありません。

User Option: debug-on-quit

この変数は、quitがシグナルされ、それがハンドルされていないときに、デバッガを呼び出すかどうかを決定します。debug-on-quitが非nilの場合は、quit(つまりC-gをタイプ)したときは常にデバッガが呼び出されます。debug-on-quitnil(デフォルト)の場合は、quitしてもデバッガは呼び出されません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.3 Entering the Debugger on a Function Call

プログラムの途中で発生する問題を調べるための有用なテクニックの1つは、特定の関数が呼び出されたときデバッガにエンターする方法です。問題が発生した関数にこれを行い、その関数をステップで追ったり、問題箇所の少し手前の関数呼び出しでこれを行い、その関数をステップオーバーしてその後をステップで追うことができます。

Command: debug-on-entry function-name

この関数は、function-nameが呼び出されるたびにデバッガの呼び出しを要求します。

Lispコードで定義された任意の関数およびマクロは、インタープリターに解釈されたコードかコンパイル済みのコードかに関わらず、エントリーにbreakをセットできます。その関数がコマンドの場合は、Lispから呼び出されたときと、インタラクティブに呼び出されたとき、デバッガにエンターします。(たとえばCで記述された)プリミティブ関数にも、この方法でdebug-on-entryをセットできますが、そのプリミティブがLispコードから呼び出されたときだけ効果があります。debug-on-entryはスペシャルフォームにはセットできません。

debug-on-entryがインタラクティブに呼び出されたときは、ミニバッファーでfunction-nameの入力を求めます。その関数がすでにエントリーでデバッガを呼び出すようにセットアップされていた場合、debug-on-entryは何も行いません。debug-on-entryは常にfunction-nameをリターンします。

以下は、この関数の使い方を説明するための例です:

(defun fact (n)
  (if (zerop n) 1
      (* n (fact (1- n)))))
     ⇒ fact
(debug-on-entry 'fact)
     ⇒ fact
(fact 3)
------ Buffer: *Backtrace* ------
Debugger entered--entering a function:
* fact(3)
  eval((fact 3))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp)
------ Buffer: *Backtrace* ------
Command: cancel-debug-on-entry &optional function-name

この関数はfunction-nameにたいするdebug-on-entryの効果をアンドゥします。インタラクティブに呼び出されたときは、ミニバッファーでfunction-nameの入力を求めます。function-nameが省略された、あるいはnilの場合は、すべての関数にたいするbreak-on-entryをキャンセルします。エントリー時にbreakするようセットアップされていない関数にcancel-debug-on-entryを呼び出したときは、何も行いません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.4 Explicit Entry to the Debugger

プログラム内の特定箇所に式(debug)を記述することにより、その箇所でデバッガが呼び出されるようにできます。これを行うにはソースファイルをvisitして、適切な箇所にテキスト‘(debug)’を挿入し、C-M-x(Lispモードでのeval-defunにたいするキーバインド)をタイプします。警告: 一時的なデバッグ目的のためにこれを行なう場合は、ファイルを保存する前に確実にアンドゥしてください!

(debug)’を挿入する箇所は、追加フォームが評価されることができ、その値を無視することができる箇所でなければなりません。(‘(debug)’の値が無視されない場合が、プログラムの実行が変更されてしまうでしょう!) 一般的にもっとも適した箇所は、prognまたは暗黙的なprogn(Sequencingを参照)の内部です。

デバッグ命令を配したいソースコード中の正確な箇所がわからないが、特定のメッセージが表示されたときにバックトレースを表示したい場合は、意図するメッセージにマッチする正規表現をdebug-on-messageにセットできます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.5 Using the Debugger

デバッガにエンターすると、その前に選択されていたウィンドウを1つのウィンドウに表示し、他のウィンドウに*Backtrace*という名前のバッファーを表示します。backtraceバッファーには、現在実行されているLisp関数の各レベルが1行ずつ含まれます。このバッファーの先頭は、デバッガが呼び出された理由を説明するメッセージ(デバッガがエラーにより呼び出された場合はエラーメッセージや関連するデータなど)です。

backtraceバッファーは読み取り専用で、文字キーにデバッガコマンドが定義されたDebuggerモードという特別なメジャーモードを使用します。通常のEmacs編集コマンドが利用できます。したがって、エラー時に編集されていたバッファーを調べるためにウィンドウを切り替えたり、バッファーを切り替えやファイルのvisit、その他一連の編集処理を行なうことができます。しかしデバッガは再帰編集レベル(Recursive Editingを参照)にあり、編集が終わったらそれはbacktraceバッファーに戻って、(qコマンドで)デバッガをexitできます。デバッガをexitすることにより、再帰編集を抜け出し、backtraceバッファーはバリー(bury: 覆い隠す)されます。(変数debugger-bury-or-killwをセットすることにより、backtraceバッファーでqコマンドが何を行うかをカスタマイズできます。たとえば、バッファーをバリーせずにkillしたい場合は、この変数をkillにセットします。他の値については、変数のドキュメントを調べてください。)

デバッガにエンターしたとき、eval-expression-debug-on-errorに一致するように変数debug-on-errorが一時的にセットされます。変数eval-expression-debug-on-errorが非nilの場合、debug-on-errorは一時的にtにセットされます。これは、デバッグセッション行っている間にさらにエラーが発生すると、(デフォルトでは)他のbacktraceがトリガーされることを意味します。これが望ましくない場合は、debugger-mode-hook内でeval-expression-debug-on-errornilにセットするか、debug-on-errornilにセットすることができます。

backtraceバッファーは、実行されている関数と、その関数の引数の値を示します。しのフレームを示す行にポイントを移動して、スタックフレームを指定することもできます。(スタックフレームとは、Lispインタープリターがある関数への特定の呼び出しを記録する場所のことです。) 行ポイントがオンのフレームが、カレントフレーム(current frame)となります。デバッガコマンドのいくつかは、カレントフレームを処理します。ある行がスター(star)で始まる場合は、そのフレームをexitすることにより再びデバッガが呼び出されることを意味します。これは関数のリターン値を調べるとき有用です。

関数名にアンダーラインが引かれている場合は、デバッガがその関数のソースコードも位置を知っていることを意味します。その名前をマウスでクリックするか、そこに移動してRETをタイプして、ソースコードをvisitできます。

デバッガはデバッガ自身のスタックフレーム数を想定するため、バイトコンパイルされて実行されなければなりません。デバッガがインタープリターに解釈されて実行されているとき、これらの想定は正しくなくなります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.6 Debugger Commands

(Debuggerモードの)debuggerバッファーでは、通常のEmacsコマンドに加えて、特別なコマンドが提供されます。デバッガでもっとも重要な使い方をするのは、制御フローを見ることができるコードをステップ実行するコマンドです。デバッガはインタープリターにより解釈された制御構造のステップ実行はできますが、バイトコンパイル済みの関数ではできません。バイトコンパイル済み関数をステップ実行したい場合は、同じ関数の解釈された定義に置き換えてください。(これを行なうには、その関数のソースをvisitして、関数の定義でC-M-xとタイプしてください。) プリミティブ関数のステップ実行にLispデバッガは使用できません。

以下はDebuggerモードのコマンドのリストです:

c

デバッガをexitして、実行を継続する。これはあたかもデバッガにエンターしなかったかのように(デバッガ内で行った変数値やデータ構造の変更などの副作用は除外される)、プログラムの実行を再開する。

d

実行を継続するが、次にLisp関数が何か呼び出されたときはデバッガにエンターする。これにより、ある式の下位の式をステップ実行して、下位の式が計算する値や、行うことを確認できる。

デバッガにエンターした関数呼び出しにたいして、この方法で作成されたスタックフレームには自動的にフラグがつくので、そのフレームをexitすると再びデバッガが呼び出されます。このフラグは、uコマンドを使用してキャンセルできます。

b

カレントフレームにフラグをつけるので、そのフレームをexitするときデバッガにエンターする。この方法でフラグがつけられたフレームは、backtraceバッファーでスターのマークがつく。

u

カレントフレームをexitしたとき、デバッガにエンターしてはならない。これは、そのフレームのbコマンドをキャンセルする。目に見える効果としては、backtraceバッファーの行からスターが削除される。

j

bと同じようにカレントフレームにフラグをつける。その後、cのように実行を継続するが、debug-on-entryによりセットアップされたすべての関数にたいするbreak-on-entryを一時的に無効にする。

e

ミニバッファーのLisp式を読み取り、(関連するlexical環境が適切なら)評価して、エコーエリアに値をプリントする。デバッガは特定の重要な変数とバッファーを処理の一部としてを変更する。eは一時的にデバッガの外部からそれらの値をリストアするので、それらを調べて変更できる。これによりデバッガはより透過的になる。対照的に、デバッガ内でM-:は特別なことを行わず、デバッガ内での変数の値を表示する。

R

eと同様だが、バッファー*Debugger-record*内の評価の結果も保存する。

q

デバッグされているプログラムを終了し、Emacsコマンド実行のトップレベルにリターンする。

C-gによりデバッガにエンターしたが、実際はデバッグではなくquitしたいときは、qコマンドを使用する。

r

デバッガから値をリターンする。ミニバッファーで式を読み取り、それを評価することにより、値が計算される。

dコマンドは、(bによるリクエスト、またはdによるそのフレームへのエンターによる)Lisp呼び出しフレームからのexitでデバッガが呼び出されたときに有用です。rコマンドで指定された値は、そのフレームの値として使用されます。これは、debugを呼び出して、そのリターン値を使用するときも有用です。それ以外は、rcと同じ効果をもyい、指定されたリターン値は問題になりません。

エラーによりデバッガにエンターしたときは、rコマンドは使用できません。

l

呼び出されたときにデバッガを呼び出す関数をリストします。これは、debug-on-entryによりエントリー時にbreakするようセットされた関数のリストです。

v

カレントスタックフレームのローカル変数の表示を切り替えます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.7 Invoking the Debugger

以下では、デバッガを呼び出すために使用される関数debugの完全な詳細を説明します。

Command: debug &rest debugger-args

この関数は、デバッガにエンターします。この関数は*Backtrace*(デバッガへの2回目以降の再帰エントリーでは*Backtrace*<2>、...)という名前のバッファーにバッファーを切り替えて、Lisp関数呼び出しについての情報を書き込みます。それから再帰編集にエンターして、Debuggerモードでbacktraceバッファーを表示します。

Debuggerモードのコマンドcdjrは再帰編集をexitします。その後、debugは以前のバッファーに戻って、debugを呼び出したものが何であれ、そこにリターンします。これは関数debugが呼び出し元にリターン可能な唯一の方法です。

debugger-argsを使用すると、debug*Backtrace*の最上部に残りの引数を表示するもで、ユーザーがそれらを確認できます。以下で説明する場合を除き、これは、これらの引数を使用する唯一の方法です。

しかしdebugへの1つ目の引数にたいする値は、特別な意味をもちます。(これらの値は通常、debugを呼び出すプログラマーではなく、Emacs内部でのみ使用されます。) 以下はこれら特別な値のテーブルです:

lambda

1つ目の引数galambdaの場合、それはdebug-on-next-callが非nilのときに関数にエントリーしたことによりdebugが呼び出されたことを意味する。デバッガはバッファーのトップのテキスト行に‘Debugger entered--entering a function:’と表示する。

debug

1つ目の引数がdebugの場合、それはエントリー時にデバッグされるようにセットされた関数にエントリーしたことによりdebugが呼び出されたことを意味する。デバッガはlambdaのときと同様、‘Debugger entered--entering a function:’を表示します。これはその関数のスタックフレームもマークするので、exit時にデバッガが呼び出される。

t

1つ目の引数がtの場合、それはdebug-on-next-callが非nilのときに関数呼び出しの評価によりdebugが呼び出されたことを示す。デバッガはバッファーのトップの行に‘Debugger entered--beginning evaluation of function call form:’と表示する。

exit

1つ目の引数がexitのときは、exit時にデバッガを呼び出すよう以前にマークされたスタックフレームをexitしたことを示す。この場合は、debugに与えられた2つ目の引数が、そのフレームからリターンされた値になる。デバッガはバッファーのトップの行に‘Debugger entered--returning value:’とリターンされた値を表示する。

error

1つ目の引数がerrorのときは、ハンドルされていないエラーまたはquitがシグナルされてデバッガにエンターした場合で、デバッガは‘Debugger entered--Lisp error:’とその後にシグナルされたエラーおよびsignalへの引数を表示して、それを示す。たとえば、

(let ((debug-on-error t))
  (/ 1 0))
------ Buffer: *Backtrace* ------
Debugger entered--Lisp error: (arith-error)
  /(1 0)
...
------ Buffer: *Backtrace* ------

エラーがシグナルされた場合はおそらく、変数debug-on-errorは非nilで、quitがシグナルされた場合はおそらく、変数debug-on-quitは非nilである。

nil

明示的にデバッガにエンターしたいときは、debugger-argsの1つ目の引数にnilを使用する。残りのdebugger-argsは、バッファーのトップの行にプリントされる。メッセージ — たとえばdebugが呼び出された条件を思い出すためのリマインダー — の表示にこの機能を使用できる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.8 Internals of the Debugger

このセクションでは、デバッガ内部で使用される関数と変数について説明します。

Variable: debugger

この関数の値は、デバッガを呼び出す関数呼び出しです。値には任意個の引数をとる関数、より具体的には関数の名前でなければなりません。この関数は何らかのデバッガを呼び出すべきです。この変数のデフォルト値はdebugです。

関数にたいしてLispが渡す1つ目の引数は、その関数がなぜ呼び出されたかを示します。引数の慣習は、debug(Invoking the Debugger)に詳解されています。

Command: backtrace

この関数は現在アクティブなLisp関数呼び出しのトレースをプリントします。この関数はdebug*Backtrace*バッファーに書き込む内容を得るために使用されます。どの関数呼び出しがアクティブか判断するためにスタックにアクセスしなければならないので、この関数はCで記述されています。リターン値は、常にnilです。

以下の例では、Lisp式で明示的にbacktraceを呼び出しています。これはストリームstandard-output(この場合はバッファー‘backtrace-output’)にbacktraceをプリントします。

backtraceの各行は、1つの関数呼び出しを表します。関数の引数が既知の場合は行に値が表示され、まだ計算中の場合は行にその旨が示されます。スペシャルフォームの引数は無視されます。

(with-output-to-temp-buffer "backtrace-output"
  (let ((var 1))
    (save-excursion
      (setq var (eval '(progn
                         (1+ var)
                         (list 'testing (backtrace))))))))

     ⇒ (testing nil)
----------- Buffer: backtrace-output ------------
  backtrace()
  (list ...computing arguments...)
  (progn ...)
  eval((progn (1+ var) (list (quote testing) (backtrace))))
  (setq ...)
  (save-excursion ...)
  (let ...)
  (with-output-to-temp-buffer ...)
  eval((with-output-to-temp-buffer ...))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp)
----------- Buffer: backtrace-output ------------
Variable: debug-on-next-call

この変数が非nilの場合、それは次のevalapplyfuncallの前にデバッガを呼び出すよう指定します。デバッガへのエンターにより、debug-on-next-callnilにセットされます。

デバッガのdコマンドは、この変数をセットすることにより機能します。

Function: backtrace-debug level flag

この関数は、そのスタックフレームのlevel下位のスタックフレームのdebug-on-exitフラグにflagに応じた値をセットします。flagが非nilの場合は、後にそのフレームをexitするときデバッガにエンターします。そのフレームを通じた非ローカルexitでも、デバッガにエンターします。

この関数は、デバッガだけに使用されます。

Variable: command-debug-status

この変数はカレントのインタラクティブコマンドのデバッグ状態を記録します。コマンドがインタラクティブに呼び出されるたびに、この変数はnilにバインドされます。デバッガは、同じコマンドが呼び出されたときのデバッガ呼び出しに情報を残すために、この変数をセットできます。

普通のグローバル変数ではなくこの変数を使用する利点は、そのデータが後続のコマンド呼び出しに決して引き継がれないことです。

Function: backtrace-frame frame-number

関数backtrace-frameは、Lispデバッガ内での使用を意図しています。これは、frame-numberレベル下位のスタックフレームで、何の評価が行われているかに関する情報をリターンします。

そのフレームがまだ引数を評価していない場合、またはそのフレームがスペシャルフォームの場合、値は(nil function arg-forms…)です。

そのフレームが引数を評価して関数をすでに呼び出した場合、リターン値は(t function arg-values…)です。

リターン値のfunctionは何であれ評価されたリストのCARとして提供されます。マクロ呼び出しの場合はlambda式になります。その関数に&rest引数がある場合は、リストarg-valuesの末尾に表されます。

frame-numberが範囲外の場合、backtrace-framenilをリターンします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2 Edebug

EdebugはEmacs Lispプログラムにたいするソースレベルデバッガです。これにより、以下のことができます:

以下の初めの3つのセクションは、使用を開始するためにEdebugについて十分説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.1 Using Edebug

EdebugでLispプログラムをデバッグするには、最初にデバッグしたいLispコードをインストルメント(instrument: 計装)しなければなりません。これを行なうもっともシンプルな方法は、関数またはマクロの定義に移動して、C-u C-M-x(プレフィクス引数を指定したeval-defun)を行います。コードをインストルメントする他の手段については、Instrumenting for Edebugを参照してください。

一度関数をインストルメントすると、その関数にたいする任意の呼び出しにより、Edebugがアクティブになります。Edebugがアクティブになると、どのEdebug実行モードを選択したかに依存して、その関数をステップ実行できるように実行がストップされるか、ディスプレイを更新してデバッグコマンドにたいするチェックの間、実行が継続されます。デフォルトの実行モードstepで、これは実行をストップします。Edebug Execution Modesを参照してください。

Edebugでは通常、デバッグしているLispコードをEmacsバッファーで閲覧します。これをソースコードバッファー(source code buffer)と呼び、バッファーは一時的に読み取り専用になります。

左フリンジの矢印は、その関数で実行されている行を示します。最初ポイントはその関数の実行されている行にありますが、ポイントを移動するとこれは真ではなくなります。

以下は、facの定義(以下を参照)をインストルメントして(fac 3)を実行した場合に通常目にするものです。ポイントは、ifの前の開きカッコにあります。

(defun fac (n)
=>∗(if (< 0 n)
      (* n (fac (1- n)))
    1))

関数内でEdebugが実行をストップできる位置のことを、ストップポイント(stop points)と呼びます。ストップポイントは、リストであるような部分式の前後、および変数参照の後でも発生します。以下は、関数fac内のストップポイントをピリオドで示したものです:

(defun fac (n)
  .(if .(< 0 n.).
      .(* n. .(fac .(1- n.).).).
    1).)

Emacs Lispモードのコマンドに加えて、ソースコードバッファーでは、Edebugのスペシャルコマンドが利用できます。たとえば、EdebugコマンドSPCで次のストップポイントまで実行することができます。facにエントリーした後に一度facとタイプした場合は、以下のように表示されるでしょう:

(defun fac (n)
=>(if ∗(< 0 n)
      (* n (fac (1- n)))
    1))

式の後でEdebugが実行をストップしたときは、エコーエリアにその式の値が表示されます。

他にも頻繁に使用されるコマンドとして、ストップポイントにbreakpointをセットするb、breakpointに達するまで実行するg、Edebugをexitしてトップレベルのコマンドループにリターンするqがあります。また、?とタイプするとすべてのEdebugコマンドがリストされます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.2 Instrumenting for Edebug

LispコードのデバッグにEdebugを使用するためには、最初にそのコードをインストルメント(instrument: 計装)しなければなりません。コードをインストルメントすると、適切な位置でEdebugを呼び出すために追加コードが挿入されます。

関数定義でプレフィクス引数とともにコマンドC-M-x (eval-defun)を呼び出すと、それを評価する前にその定義をインストルメントします。(ソースコード自体は変更しません。) 変数edebug-all-defsが非nilの場合は、プレフィクス引数の意味を反転します。この場合、C-M-xはプレフィクス引数がなければその定義をインストルメントします。edebug-all-defsのデフォルト値はnilです。コマンドM-x edebug-all-defsは、変数edebug-all-defsの値を切り替えます。

edebug-all-defsが非nilの場合はeval-regioneval-current-buffereval-bufferも、それらが評価する定義をインストルメントします。同様に、edebug-all-formsは、eval-regionが(非定義フォームさえ含む)あらゆるフォームをインストルメントすべきかを制御します。これはミニバッファー内でのロードや評価には適用されません。コマンドM-x edebug-all-formsは、このオプションを切り替えます。

他にもコマンドM-x edebug-eval-top-level-formが利用可能で、これはedebug-all-defsedebug-all-formsの値に関わらず、トップレベルの任意のフォームをインストルメントします。edebug-defunedebug-eval-top-level-formのエイリアスです。

Edebugがアクティブのの間、コマンドI(edebug-instrument-callee)は、ポイント後のリストフォームに呼び出される関数およびマクロ定義がまだインストルメントされていなければ、それらをインストルメントします。これは、そのファイルのソースの場所をEdebugが知っている場合だけ可能です。この理由によりEdebugロード後は、たとえ評価する定義をインストルメントしない場合でも、eval-regionは評価するすべての定義の位置を記録します。インストルメント済み関数呼び出しにステップインするiコマンド(Jumpingを参照)も参照してください。

Edebugはすべての標準スペシャルフォーム、式引数をもつinteractiveフォーム、無名ラムダ式、およびその他の定義フォームのインストルメント方法を知っています。しかし、Edebugはユーザー定義マクロが引数にたいして何を行うかを判断できないので、Edebug仕様を使用してその情報を与えなければなりません。詳細はEdebug and Macrosを参照してください。

Edebugがセッション内で最初にコードをインストルメントしようとするときは、フックedebug-setup-hookを実行してから、それにnilをセットします。使おうとしているパッケージに結びつけてEdebug仕様をロードするためにこれを使用できますが、それはEdebugを使用するときだけ機能します。

定義からインストルメントを削除するには、単にインストルメントを行わない方法でその定義を再評価するだけです。フォームを絶対にインストルメントせずに評価するには、2つの方法があります。それはファイルからのloadによる評価と、ミニバッファーからのeval-expression(M-:)による評価です。

Edebugがインストルメント中にシンタックスエラー(syntax error: 構文エラー)を検知した場合は、間違ったコードの箇所にポイントを残してinvalid-read-syntaxエラーをシグナルします。

Edebug内で利用可能な他の評価関数については、Evaluationを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.3 Edebug Execution Modes

Edebugは、デバッグするプログラムの実行にたいして、いくつかの実行モードをサポートします。これらの実行モードを、Edebug実行モード(Edebug execution modes)と呼びます。これらをメジャーモードやマイナーモードと混同しないでください。カレントのEdebug実行モードは、プログラムをストップする前にEdebugがどれだけ実行を継続するか — たとえばストップポイントごとにストップ、あるいは次のbreakpointまで継続など — と、ストップする前にEdebugがどれだけ進捗を表示するかを決定します。

Edebug実行モードは通常、ある特定のモードでプログラムを継続させるコマンドをタイプすることにより指定します。以下は、それらのコマンドのテーブルです。プログラムの実行を再開S以外は、少なくともある長さの間だけ実行を継続します。

S

Stop(ストップ): これ以上プログラムを実行しないで、Edebugのコマンドを待つ(edebug-stop)。

SPC

Step(ステップ): 次のストップポイントでストップする(edebug-step-mode)。

n

Next(次へ): 式の後にある次のストップポイントでストップする(edebug-next-mode)。Jumpingedebug-forward-sexpも参照。

t

Trace(トレース): Edebugのストップポイントごとに一時停止(通常は1秒)する(edebug-trace-mode)。

T

Rapid trace(高速でトレース):ストップポイントごとに表示を更新するが、実際に一時停止はしない(edebug-Trace-fast-mode)。

g

Go(進む): 次のbreakpointまで実行する(edebug-go-mode)。Edebug Breakpointsを参照。

c

Continue(継続): breakpointごとに一時停止してから継続する(edebug-continue-mode)。

C

Rapid continue(高速で継続): ポイントを各breakpointへ移動するが、一時停止しない(edebug-Continue-fast-mode)。

G

Go non-stop(ストップせず進む): breakpointを無視する(edebug-Go-nonstop-mode)。まだS、またはその他の編集コマンドでプログラムをストップするのは可能。

一般的に、上記リストの最初のほうにある実行モードは後のほうの実行モードに比べて、プログラムをより低速に実行、またはすぐにストップさせます。

実行中、またはトレース中は、任意のEdebugコマンドをタイプすることにより、実行をインタラプト(interrupt: 中断、割り込み)できます。Edebugは次のストップポイントでプログラムをストップしてから、タイプされたコマンドを実行します。たとえば、実行中にtをタイプすると、次のストップポイントでトレースモードに切り替えます。Sを使用すれば、他に何も行わずに実行をストップできます。

関数でたまたま読み取り入力が発生した場合には、実行のインタラプトを意図してタイプされた文字は、かわりにその関数により読み取られます。そのプログラムが入力を欲するタイミングに注意を払うことで、そのような意図せぬ結果を避けることができます。

このセクションのコマンドを含むキーボードマクロは、完全には機能しません。プログラムを再開するためにEdebugからexitすると、キーボードマクロの追跡記録は失われます。これを処理するのは、簡単ではありません。またEdebug外部でキーボードマクロを定義または実行しても、Edebug内部のコマンドに影響しません。通常これは利点です。Edebug Options内のedebug-continue-kbd-macroオプションも参照してください。

新たなEdebugレベルにエンターしたとき、初期の実行モードは変数edebug-initial-modeの値により与えられます(Edebug Optionsを参照)。デフォルトでこれはstepモードを指定します。たとえば1つのコマンドからインストルメント済みの関数が複数回呼び出された場合は、同じEdebugレベルに再エンターするかもしれないことに注意してください。

User Option: edebug-sit-for-seconds

このオプションは、traceモードおよびcontinueモードで実行ステップの間を何秒待つか指定します。デフォルトは1秒です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.4 Jumping

このセクションで説明するコマンドは、指定された場所に達するまで実行を続けます。iを除くすべてのコマンドは、ストップ場所を確立するために一時的なbreakpointを作成してから、goモードにスイッチします。意図されたストップポイントの前にある他のストップポイントに達した場合も、実行はストップします。breakpointの詳細は、Edebug Breakpointsを参照してください。

これらのコマンドは、非ローカルexitの場合はプログラムのストップを期待する一時的なbreakpointをバイパスできるので、期待どおり機能しないかもしれません。

h

ポイントがある場所の近くのストップポイントへ実行を進める(edebug-goto-here)。

f

プログラムの式を1つ分実行する(edebug-forward-sexp)。

o

sexpを含む終端までプログラムを実行する(edebug-step-out)。

i

ポイントの後のフォームから呼び出された関数またはマクロにステップインする(edebug-step-in)。

hコマンドは一時的なbreakpointを使用して、ポイントのカレント位置、またはその後のストップポイントまで処理を進めます。

fコマンドは式を1つ飛び越してプログラムを実家します。より正確には、forward-sexpにより到達できる位置に一時的なbreakpointをセットしてからgoモードで実行するので、プログラムはそのbreakpointでストップすることになります。

プレフィクス引数nとともに使用した場合は、ポイントからn個のsexp(s-expression: S式)を超えた場所に一時的なbreakpointをセットします。ポイントを含むリストがnより少ない要素で終わるような場合は、ストップ箇所はポイントが含まれる式の後になります。

forward-sexpが見つける位置と、プログラムを実際にストップさせたい位置なのかチェックしなければなりません。たとえばcond内では、これは正しくないかもしれません。

fコマンドは柔軟性を与えるために、forward-sexpをストップポイントではなく、ポイント位置から開始します。カレントのストップポイントから1つの式を実行したい場合は、まずそこにポイントを移動するためにw(edebug-where)をタイプして、それからfをタイプしてください。

oコマンドは、式の“外側”で実行を継続します。これは、ポイントを含む式の最後に一時的なbreakpointを配します。ポイントを含むsexpが関数定義の場合、oはその定義内の最後のsexpの直前まで実行を継続します。もし定義内の最後のsexpの直前にポイントがある場合は、その関数からリターンしてからストップします。他の言い方をすると、このコマンドは最後のsexpの後にポイントがない場合は、カレントで実行中の関数からexitしません。

iコマンドは、ポイントの後のリストフォームに呼び出された関数、またはマクロにステップインします。そのフォームは、評価されようとしているもの1つである必要はないことに注意してください。しかし、そのフォームが評価されようとしている関数呼び出しの場合は、引数が何も評価されないうちにこのコマンドを使用しないと、遅すぎることを覚えておいてください。

iコマンドは、ステップインしようとしている関数またはマクロがまだインストルメントされていない場合は、それらをインストルメントします。これは便利かもしれませんが、それらを明示的に非インストルメントしない場合、その関数またはマクロはインストルメントされたままになることを覚えておいてください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.5 Miscellaneous Edebug Commands

Some miscellaneous Edebug commands are described here.

?

Display the help message for Edebug (edebug-help).

C-]

Abort one level back to the previous command level (abort-recursive-edit).

q

Return to the top level editor command loop (top-level). This exits all recursive editing levels, including all levels of Edebug activity. However, instrumented code protected with unwind-protect or condition-case forms may resume debugging.

Q

Like q, but don’t stop even for protected code (edebug-top-level-nonstop).

r

Redisplay the most recently known expression result in the echo area (edebug-previous-result).

d

Display a backtrace, excluding Edebug’s own functions for clarity (edebug-backtrace).

You cannot use debugger commands in the backtrace buffer in Edebug as you would in the standard debugger.

The backtrace buffer is killed automatically when you continue execution.

You can invoke commands from Edebug that activate Edebug again recursively. Whenever Edebug is active, you can quit to the top level with q or abort one recursive edit level with C-]. You can display a backtrace of all the pending evaluations with d.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.6 Breaks

Edebug’s step mode stops execution when the next stop point is reached. There are three other ways to stop Edebug execution once it has started: breakpoints, the global break condition, and source breakpoints.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.6.1 Edebug Breakpoints

While using Edebug, you can specify breakpoints in the program you are testing: these are places where execution should stop. You can set a breakpoint at any stop point, as defined in Using Edebug. For setting and unsetting breakpoints, the stop point that is affected is the first one at or after point in the source code buffer. Here are the Edebug commands for breakpoints:

b

Set a breakpoint at the stop point at or after point (edebug-set-breakpoint). If you use a prefix argument, the breakpoint is temporary—it turns off the first time it stops the program.

u

Unset the breakpoint (if any) at the stop point at or after point (edebug-unset-breakpoint).

x condition RET

Set a conditional breakpoint which stops the program only if evaluating condition produces a non-nil value (edebug-set-conditional-breakpoint). With a prefix argument, the breakpoint is temporary.

B

Move point to the next breakpoint in the current definition (edebug-next-breakpoint).

While in Edebug, you can set a breakpoint with b and unset one with u. First move point to the Edebug stop point of your choice, then type b or u to set or unset a breakpoint there. Unsetting a breakpoint where none has been set has no effect.

Re-evaluating or reinstrumenting a definition removes all of its previous breakpoints.

A conditional breakpoint tests a condition each time the program gets there. Any errors that occur as a result of evaluating the condition are ignored, as if the result were nil. To set a conditional breakpoint, use x, and specify the condition expression in the minibuffer. Setting a conditional breakpoint at a stop point that has a previously established conditional breakpoint puts the previous condition expression in the minibuffer so you can edit it.

You can make a conditional or unconditional breakpoint temporary by using a prefix argument with the command to set the breakpoint. When a temporary breakpoint stops the program, it is automatically unset.

Edebug always stops or pauses at a breakpoint, except when the Edebug mode is Go-nonstop. In that mode, it ignores breakpoints entirely.

To find out where your breakpoints are, use the B command, which moves point to the next breakpoint following point, within the same function, or to the first breakpoint if there are no following breakpoints. This command does not continue execution—it just moves point in the buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.6.2 Global Break Condition

A global break condition stops execution when a specified condition is satisfied, no matter where that may occur. Edebug evaluates the global break condition at every stop point; if it evaluates to a non-nil value, then execution stops or pauses depending on the execution mode, as if a breakpoint had been hit. If evaluating the condition gets an error, execution does not stop.

The condition expression is stored in edebug-global-break-condition. You can specify a new expression using the X command from the source code buffer while Edebug is active, or using C-x X X from any buffer at any time, as long as Edebug is loaded (edebug-set-global-break-condition).

The global break condition is the simplest way to find where in your code some event occurs, but it makes code run much more slowly. So you should reset the condition to nil when not using it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.6.3 Source Breakpoints

All breakpoints in a definition are forgotten each time you reinstrument it. If you wish to make a breakpoint that won’t be forgotten, you can write a source breakpoint, which is simply a call to the function edebug in your source code. You can, of course, make such a call conditional. For example, in the fac function, you can insert the first line as shown below, to stop when the argument reaches zero:

(defun fac (n)
  (if (= n 0) (edebug))
  (if (< 0 n)
      (* n (fac (1- n)))
    1))

When the fac definition is instrumented and the function is called, the call to edebug acts as a breakpoint. Depending on the execution mode, Edebug stops or pauses there.

If no instrumented code is being executed when edebug is called, that function calls debug.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.7 Trapping Errors

Emacs normally displays an error message when an error is signaled and not handled with condition-case. While Edebug is active and executing instrumented code, it normally responds to all unhandled errors. You can customize this with the options edebug-on-error and edebug-on-quit; see Edebug Options.

When Edebug responds to an error, it shows the last stop point encountered before the error. This may be the location of a call to a function which was not instrumented, and within which the error actually occurred. For an unbound variable error, the last known stop point might be quite distant from the offending variable reference. In that case, you might want to display a full backtrace (see section Miscellaneous Edebug Commands).

If you change debug-on-error or debug-on-quit while Edebug is active, these changes will be forgotten when Edebug becomes inactive. Furthermore, during Edebug’s recursive edit, these variables are bound to the values they had outside of Edebug.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.8 Edebug Views

These Edebug commands let you view aspects of the buffer and window status as they were before entry to Edebug. The outside window configuration is the collection of windows and contents that were in effect outside of Edebug.

v

Switch to viewing the outside window configuration (edebug-view-outside). Type C-x X w to return to Edebug.

p

Temporarily display the outside current buffer with point at its outside position (edebug-bounce-point), pausing for one second before returning to Edebug. With a prefix argument n, pause for n seconds instead.

w

Move point back to the current stop point in the source code buffer (edebug-where).

If you use this command in a different window displaying the same buffer, that window will be used instead to display the current definition in the future.

W

Toggle whether Edebug saves and restores the outside window configuration (edebug-toggle-save-windows).

With a prefix argument, W only toggles saving and restoring of the selected window. To specify a window that is not displaying the source code buffer, you must use C-x X W from the global keymap.

You can view the outside window configuration with v or just bounce to the point in the current buffer with p, even if it is not normally displayed.

After moving point, you may wish to jump back to the stop point. You can do that with w from a source code buffer. You can jump back to the stop point in the source code buffer from any buffer using C-x X w.

Each time you use W to turn saving off, Edebug forgets the saved outside window configuration—so that even if you turn saving back on, the current window configuration remains unchanged when you next exit Edebug (by continuing the program). However, the automatic redisplay of *edebug* and *edebug-trace* may conflict with the buffers you wish to see unless you have enough windows open.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.9 Evaluation

While within Edebug, you can evaluate expressions as if Edebug were not running. Edebug tries to be invisible to the expression’s evaluation and printing. Evaluation of expressions that cause side effects will work as expected, except for changes to data that Edebug explicitly saves and restores. See section The Outside Context, for details on this process.

e exp RET

Evaluate expression exp in the context outside of Edebug (edebug-eval-expression). That is, Edebug tries to minimize its interference with the evaluation.

M-: exp RET

Evaluate expression exp in the context of Edebug itself (eval-expression).

C-x C-e

Evaluate the expression before point, in the context outside of Edebug (edebug-eval-last-sexp).

Edebug supports evaluation of expressions containing references to lexically bound symbols created by the following constructs in cl.el: lexical-let, macrolet, and symbol-macrolet.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.10 Evaluation List Buffer

You can use the evaluation list buffer, called *edebug*, to evaluate expressions interactively. You can also set up the evaluation list of expressions to be evaluated automatically each time Edebug updates the display.

E

Switch to the evaluation list buffer *edebug* (edebug-visit-eval-list).

In the *edebug* buffer you can use the commands of Lisp Interaction mode (see Lisp Interaction in The GNU Emacs Manual) as well as these special commands:

C-j

Evaluate the expression before point, in the outside context, and insert the value in the buffer (edebug-eval-print-last-sexp).

C-x C-e

Evaluate the expression before point, in the context outside of Edebug (edebug-eval-last-sexp).

C-c C-u

Build a new evaluation list from the contents of the buffer (edebug-update-eval-list).

C-c C-d

Delete the evaluation list group that point is in (edebug-delete-eval-item).

C-c C-w

Switch back to the source code buffer at the current stop point (edebug-where).

You can evaluate expressions in the evaluation list window with C-j or C-x C-e, just as you would in *scratch*; but they are evaluated in the context outside of Edebug.

The expressions you enter interactively (and their results) are lost when you continue execution; but you can set up an evaluation list consisting of expressions to be evaluated each time execution stops.

To do this, write one or more evaluation list groups in the evaluation list buffer. An evaluation list group consists of one or more Lisp expressions. Groups are separated by comment lines.

The command C-c C-u (edebug-update-eval-list) rebuilds the evaluation list, scanning the buffer and using the first expression of each group. (The idea is that the second expression of the group is the value previously computed and displayed.)

Each entry to Edebug redisplays the evaluation list by inserting each expression in the buffer, followed by its current value. It also inserts comment lines so that each expression becomes its own group. Thus, if you type C-c C-u again without changing the buffer text, the evaluation list is effectively unchanged.

If an error occurs during an evaluation from the evaluation list, the error message is displayed in a string as if it were the result. Therefore, expressions using variables that are not currently valid do not interrupt your debugging.

Here is an example of what the evaluation list window looks like after several expressions have been added to it:

(current-buffer)
#<buffer *scratch*>
;---------------------------------------------------------------
(selected-window)
#<window 16 on *scratch*>
;---------------------------------------------------------------
(point)
196
;---------------------------------------------------------------
bad-var
"Symbol's value as variable is void: bad-var"
;---------------------------------------------------------------
(recursion-depth)
0
;---------------------------------------------------------------
this-command
eval-last-sexp
;---------------------------------------------------------------

To delete a group, move point into it and type C-c C-d, or simply delete the text for the group and update the evaluation list with C-c C-u. To add a new expression to the evaluation list, insert the expression at a suitable place, insert a new comment line, then type C-c C-u. You need not insert dashes in the comment line—its contents don’t matter.

After selecting *edebug*, you can return to the source code buffer with C-c C-w. The *edebug* buffer is killed when you continue execution, and recreated next time it is needed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.11 Printing in Edebug

If an expression in your program produces a value containing circular list structure, you may get an error when Edebug attempts to print it.

One way to cope with circular structure is to set print-length or print-level to truncate the printing. Edebug does this for you; it binds print-length and print-level to the values of the variables edebug-print-length and edebug-print-level (so long as they have non-nil values). See section Variables Affecting Output.

User Option: edebug-print-length

If non-nil, Edebug binds print-length to this value while printing results. The default value is 50.

User Option: edebug-print-level

If non-nil, Edebug binds print-level to this value while printing results. The default value is 50.

You can also print circular structures and structures that share elements more informatively by binding print-circle to a non-nil value.

Here is an example of code that creates a circular structure:

(setq a '(x y))
(setcar a a)

Custom printing prints this as ‘Result: #1=(#1# y)’. The ‘#1=’ notation labels the structure that follows it with the label ‘1’, and the ‘#1#’ notation references the previously labeled structure. This notation is used for any shared elements of lists or vectors.

User Option: edebug-print-circle

If non-nil, Edebug binds print-circle to this value while printing results. The default value is t.

Other programs can also use custom printing; see cust-print.el for details.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.12 Trace Buffer

Edebug can record an execution trace, storing it in a buffer named *edebug-trace*. This is a log of function calls and returns, showing the function names and their arguments and values. To enable trace recording, set edebug-trace to a non-nil value.

Making a trace buffer is not the same thing as using trace execution mode (see section Edebug Execution Modes).

When trace recording is enabled, each function entry and exit adds lines to the trace buffer. A function entry record consists of ‘::::{’, followed by the function name and argument values. A function exit record consists of ‘::::}’, followed by the function name and result of the function.

The number of ‘:’s in an entry shows its recursion depth. You can use the braces in the trace buffer to find the matching beginning or end of function calls.

You can customize trace recording for function entry and exit by redefining the functions edebug-print-trace-before and edebug-print-trace-after.

Macro: edebug-tracing string body…

This macro requests additional trace information around the execution of the body forms. The argument string specifies text to put in the trace buffer, after the ‘{’ or ‘}’. All the arguments are evaluated, and edebug-tracing returns the value of the last form in body.

Function: edebug-trace format-string &rest format-args

This function inserts text in the trace buffer. It computes the text with (apply 'format format-string format-args). It also appends a newline to separate entries.

edebug-tracing and edebug-trace insert lines in the trace buffer whenever they are called, even if Edebug is not active. Adding text to the trace buffer also scrolls its window to show the last lines inserted.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.13 Coverage Testing

Edebug provides rudimentary coverage testing and display of execution frequency.

Coverage testing works by comparing the result of each expression with the previous result; each form in the program is considered “covered” if it has returned two different values since you began testing coverage in the current Emacs session. Thus, to do coverage testing on your program, execute it under various conditions and note whether it behaves correctly; Edebug will tell you when you have tried enough different conditions that each form has returned two different values.

Coverage testing makes execution slower, so it is only done if edebug-test-coverage is non-nil. Frequency counting is performed for all executions of an instrumented function, even if the execution mode is Go-nonstop, and regardless of whether coverage testing is enabled.

Use C-x X = (edebug-display-freq-count) to display both the coverage information and the frequency counts for a definition. Just = (edebug-temp-display-freq-count) displays the same information temporarily, only until you type another key.

Command: edebug-display-freq-count

This command displays the frequency count data for each line of the current definition.

It inserts frequency counts as comment lines after each line of code. You can undo all insertions with one undo command. The counts appear under the ‘(’ before an expression or the ‘)’ after an expression, or on the last character of a variable. To simplify the display, a count is not shown if it is equal to the count of an earlier expression on the same line.

The character ‘=’ following the count for an expression says that the expression has returned the same value each time it was evaluated. In other words, it is not yet “covered” for coverage testing purposes.

To clear the frequency count and coverage data for a definition, simply reinstrument it with eval-defun.

For example, after evaluating (fac 5) with a source breakpoint, and setting edebug-test-coverage to t, when the breakpoint is reached, the frequency data looks like this:

(defun fac (n)
  (if (= n 0) (edebug))
;#6           1      = =5
  (if (< 0 n)
;#5         =
      (* n (fac (1- n)))
;#    5               0
    1))
;#   0

The comment lines show that fac was called 6 times. The first if statement returned 5 times with the same result each time; the same is true of the condition on the second if. The recursive call of fac did not return at all.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.14 The Outside Context

Edebug tries to be transparent to the program you are debugging, but it does not succeed completely. Edebug also tries to be transparent when you evaluate expressions with e or with the evaluation list buffer, by temporarily restoring the outside context. This section explains precisely what context Edebug restores, and how Edebug fails to be completely transparent.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.14.1 Checking Whether to Stop

Whenever Edebug is entered, it needs to save and restore certain data before even deciding whether to make trace information or stop the program.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.14.2 Edebug Display Update

When Edebug needs to display something (e.g., in trace mode), it saves the current window configuration from “outside” Edebug (see section Window Configurations). When you exit Edebug, it restores the previous window configuration.

Emacs redisplays only when it pauses. Usually, when you continue execution, the program re-enters Edebug at a breakpoint or after stepping, without pausing or reading input in between. In such cases, Emacs never gets a chance to redisplay the “outside” configuration. Consequently, what you see is the same window configuration as the last time Edebug was active, with no interruption.

Entry to Edebug for displaying something also saves and restores the following data (though some of them are deliberately not restored if an error or quit signal occurs).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.14.3 Edebug Recursive Edit

When Edebug is entered and actually reads commands from the user, it saves (and later restores) these additional data:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15 Edebug and Macros

To make Edebug properly instrument expressions that call macros, some extra care is needed. This subsection explains the details.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15.1 Instrumenting Macro Calls

When Edebug instruments an expression that calls a Lisp macro, it needs additional information about the macro to do the job properly. This is because there is no a-priori way to tell which subexpressions of the macro call are forms to be evaluated. (Evaluation may occur explicitly in the macro body, or when the resulting expansion is evaluated, or any time later.)

Therefore, you must define an Edebug specification for each macro that Edebug will encounter, to explain the format of calls to that macro. To do this, add a debug declaration to the macro definition. Here is a simple example that shows the specification for the for example macro (see section Evaluating Macro Arguments Repeatedly).

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  (declare (debug (symbolp "from" form "to" form "do" &rest form)))
  ...)

The Edebug specification says which parts of a call to the macro are forms to be evaluated. For simple macros, the specification often looks very similar to the formal argument list of the macro definition, but specifications are much more general than macro arguments. See section Defining Macros, for more explanation of the declare form.

Take care to ensure that the specifications are known to Edebug when you instrument code. If you are instrumenting a function from a file that uses eval-when-compile to require another file containing macro definitions, you may need to explicitly load that file.

You can also define an edebug specification for a macro separately from the macro definition with def-edebug-spec. Adding debug declarations is preferred, and more convenient, for macro definitions in Lisp, but def-edebug-spec makes it possible to define Edebug specifications for special forms implemented in C.

Macro: def-edebug-spec macro specification

Specify which expressions of a call to macro macro are forms to be evaluated. specification should be the edebug specification. Neither argument is evaluated.

The macro argument can actually be any symbol, not just a macro name.

Here is a table of the possibilities for specification and how each directs processing of arguments.

t

All arguments are instrumented for evaluation.

0

None of the arguments is instrumented.

a symbol

The symbol must have an Edebug specification, which is used instead. This indirection is repeated until another kind of specification is found. This allows you to inherit the specification from another macro.

a list

The elements of the list describe the types of the arguments of a calling form. The possible elements of a specification list are described in the following sections.

If a macro has no Edebug specification, neither through a debug declaration nor through a def-edebug-spec call, the variable edebug-eval-macro-args comes into play.

User Option: edebug-eval-macro-args

This controls the way Edebug treats macro arguments with no explicit Edebug specification. If it is nil (the default), none of the arguments is instrumented for evaluation. Otherwise, all arguments are instrumented.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15.2 Specification List

A specification list is required for an Edebug specification if some arguments of a macro call are evaluated while others are not. Some elements in a specification list match one or more arguments, but others modify the processing of all following elements. The latter, called specification keywords, are symbols beginning with ‘&’ (such as &optional).

A specification list may contain sublists, which match arguments that are themselves lists, or it may contain vectors used for grouping. Sublists and groups thus subdivide the specification list into a hierarchy of levels. Specification keywords apply only to the remainder of the sublist or group they are contained in.

When a specification list involves alternatives or repetition, matching it against an actual macro call may require backtracking. For more details, see section Backtracking in Specifications.

Edebug specifications provide the power of regular expression matching, plus some context-free grammar constructs: the matching of sublists with balanced parentheses, recursive processing of forms, and recursion via indirect specifications.

Here’s a table of the possible elements of a specification list, with their meanings (see Specification Examples, for the referenced examples):

sexp

A single unevaluated Lisp object, which is not instrumented.

form

A single evaluated expression, which is instrumented.

place

A generalized variable. See section Generalized Variables.

body

Short for &rest form. See &rest below.

function-form

A function form: either a quoted function symbol, a quoted lambda expression, or a form (that should evaluate to a function symbol or lambda expression). This is useful when an argument that’s a lambda expression might be quoted with quote rather than function, since it instruments the body of the lambda expression either way.

lambda-expr

A lambda expression with no quoting.

&optional

All following elements in the specification list are optional; as soon as one does not match, Edebug stops matching at this level.

To make just a few elements optional, followed by non-optional elements, use [&optional specs…]. To specify that several elements must all match or none, use &optional [specs…]. See the defun example.

&rest

All following elements in the specification list are repeated zero or more times. In the last repetition, however, it is not a problem if the expression runs out before matching all of the elements of the specification list.

To repeat only a few elements, use [&rest specs…]. To specify several elements that must all match on every repetition, use &rest [specs…].

&or

Each of the following elements in the specification list is an alternative. One of the alternatives must match, or the &or specification fails.

Each list element following &or is a single alternative. To group two or more list elements as a single alternative, enclose them in […].

&not

Each of the following elements is matched as alternatives as if by using &or, but if any of them match, the specification fails. If none of them match, nothing is matched, but the &not specification succeeds.

&define

Indicates that the specification is for a defining form. The defining form itself is not instrumented (that is, Edebug does not stop before and after the defining form), but forms inside it typically will be instrumented. The &define keyword should be the first element in a list specification.

nil

This is successful when there are no more arguments to match at the current argument list level; otherwise it fails. See sublist specifications and the backquote example.

gate

No argument is matched but backtracking through the gate is disabled while matching the remainder of the specifications at this level. This is primarily used to generate more specific syntax error messages. See Backtracking in Specifications, for more details. Also see the let example.

other-symbol

Any other symbol in a specification list may be a predicate or an indirect specification.

If the symbol has an Edebug specification, this indirect specification should be either a list specification that is used in place of the symbol, or a function that is called to process the arguments. The specification may be defined with def-edebug-spec just as for macros. See the defun example.

Otherwise, the symbol should be a predicate. The predicate is called with the argument, and if the predicate returns nil, the specification fails and the argument is not instrumented.

Some suitable predicates include symbolp, integerp, stringp, vectorp, and atom.

[elements…]

A vector of elements groups the elements into a single group specification. Its meaning has nothing to do with vectors.

"string"

The argument should be a symbol named string. This specification is equivalent to the quoted symbol, 'symbol, where the name of symbol is the string, but the string form is preferred.

(vector elements…)

The argument should be a vector whose elements must match the elements in the specification. See the backquote example.

(elements…)

Any other list is a sublist specification and the argument must be a list whose elements match the specification elements.

A sublist specification may be a dotted list and the corresponding list argument may then be a dotted list. Alternatively, the last CDR of a dotted list specification may be another sublist specification (via a grouping or an indirect specification, e.g., (spec . [(more specs…)])) whose elements match the non-dotted list arguments. This is useful in recursive specifications such as in the backquote example. Also see the description of a nil specification above for terminating such recursion.

Note that a sublist specification written as (specs . nil) is equivalent to (specs), and (specs . (sublist-elements…)) is equivalent to (specs sublist-elements…).

Here is a list of additional specifications that may appear only after &define. See the defun example.

name

The argument, a symbol, is the name of the defining form.

A defining form is not required to have a name field; and it may have multiple name fields.

:name

This construct does not actually match an argument. The element following :name should be a symbol; it is used as an additional name component for the definition. You can use this to add a unique, static component to the name of the definition. It may be used more than once.

arg

The argument, a symbol, is the name of an argument of the defining form. However, lambda-list keywords (symbols starting with ‘&’) are not allowed.

lambda-list

This matches a lambda list—the argument list of a lambda expression.

def-body

The argument is the body of code in a definition. This is like body, described above, but a definition body must be instrumented with a different Edebug call that looks up information associated with the definition. Use def-body for the highest level list of forms within the definition.

def-form

The argument is a single, highest-level form in a definition. This is like def-body, except it is used to match a single form rather than a list of forms. As a special case, def-form also means that tracing information is not output when the form is executed. See the interactive example.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15.3 Backtracking in Specifications

If a specification fails to match at some point, this does not necessarily mean a syntax error will be signaled; instead, backtracking will take place until all alternatives have been exhausted. Eventually every element of the argument list must be matched by some element in the specification, and every required element in the specification must match some argument.

When a syntax error is detected, it might not be reported until much later, after higher-level alternatives have been exhausted, and with the point positioned further from the real error. But if backtracking is disabled when an error occurs, it can be reported immediately. Note that backtracking is also reenabled automatically in several situations; when a new alternative is established by &optional, &rest, or &or, or at the start of processing a sublist, group, or indirect specification. The effect of enabling or disabling backtracking is limited to the remainder of the level currently being processed and lower levels.

Backtracking is disabled while matching any of the form specifications (that is, form, body, def-form, and def-body). These specifications will match any form so any error must be in the form itself rather than at a higher level.

Backtracking is also disabled after successfully matching a quoted symbol or string specification, since this usually indicates a recognized construct. But if you have a set of alternative constructs that all begin with the same symbol, you can usually work around this constraint by factoring the symbol out of the alternatives, e.g., ["foo" &or [first case] [second case] ...].

Most needs are satisfied by these two ways that backtracking is automatically disabled, but occasionally it is useful to explicitly disable backtracking by using the gate specification. This is useful when you know that no higher alternatives could apply. See the example of the let specification.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15.4 Specification Examples

It may be easier to understand Edebug specifications by studying the examples provided here.

A let special form has a sequence of bindings and a body. Each of the bindings is either a symbol or a sublist with a symbol and optional expression. In the specification below, notice the gate inside of the sublist to prevent backtracking once a sublist is found.

(def-edebug-spec let
  ((&rest
    &or symbolp (gate symbolp &optional form))
   body))

Edebug uses the following specifications for defun and the associated argument list and interactive specifications. It is necessary to handle interactive forms specially since an expression argument is actually evaluated outside of the function body. (The specification for defmacro is very similar to that for defun, but allows for the declare statement.)

(def-edebug-spec defun
  (&define name lambda-list
           [&optional stringp]   ; Match the doc string, if present.
           [&optional ("interactive" interactive)]
           def-body))

(def-edebug-spec lambda-list
  (([&rest arg]
    [&optional ["&optional" arg &rest arg]]
    &optional ["&rest" arg]
    )))

(def-edebug-spec interactive
  (&optional &or stringp def-form))    ; Notice: def-form

The specification for backquote below illustrates how to match dotted lists and use nil to terminate recursion. It also illustrates how components of a vector may be matched. (The actual specification defined by Edebug is a little different, and does not support dotted lists because doing so causes very deep recursion that could fail.)

(def-edebug-spec \` (backquote-form))   ; Alias just for clarity.

(def-edebug-spec backquote-form
  (&or ([&or "," ",@"] &or ("quote" backquote-form) form)
       (backquote-form . [&or nil backquote-form])
       (vector &rest backquote-form)
       sexp))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.16 Edebug Options

These options affect the behavior of Edebug:

User Option: edebug-setup-hook

Functions to call before Edebug is used. Each time it is set to a new value, Edebug will call those functions once and then reset edebug-setup-hook to nil. You could use this to load up Edebug specifications associated with a package you are using, but only when you also use Edebug. See section Instrumenting for Edebug.

User Option: edebug-all-defs

If this is non-nil, normal evaluation of defining forms such as defun and defmacro instruments them for Edebug. This applies to eval-defun, eval-region, eval-buffer, and eval-current-buffer.

Use the command M-x edebug-all-defs to toggle the value of this option. See section Instrumenting for Edebug.

User Option: edebug-all-forms

If this is non-nil, the commands eval-defun, eval-region, eval-buffer, and eval-current-buffer instrument all forms, even those that don’t define anything. This doesn’t apply to loading or evaluations in the minibuffer.

Use the command M-x edebug-all-forms to toggle the value of this option. See section Instrumenting for Edebug.

User Option: edebug-save-windows

If this is non-nil, Edebug saves and restores the window configuration. That takes some time, so if your program does not care what happens to the window configurations, it is better to set this variable to nil.

If the value is a list, only the listed windows are saved and restored.

You can use the W command in Edebug to change this variable interactively. See section Edebug Display Update.

User Option: edebug-save-displayed-buffer-points

If this is non-nil, Edebug saves and restores point in all displayed buffers.

Saving and restoring point in other buffers is necessary if you are debugging code that changes the point of a buffer that is displayed in a non-selected window. If Edebug or the user then selects the window, point in that buffer will move to the window’s value of point.

Saving and restoring point in all buffers is expensive, since it requires selecting each window twice, so enable this only if you need it. See section Edebug Display Update.

User Option: edebug-initial-mode

If this variable is non-nil, it specifies the initial execution mode for Edebug when it is first activated. Possible values are step, next, go, Go-nonstop, trace, Trace-fast, continue, and Continue-fast.

The default value is step. See section Edebug Execution Modes.

User Option: edebug-trace

If this is non-nil, trace each function entry and exit. Tracing output is displayed in a buffer named *edebug-trace*, one function entry or exit per line, indented by the recursion level.

Also see edebug-tracing, in Trace Buffer.

User Option: edebug-test-coverage

If non-nil, Edebug tests coverage of all expressions debugged. See section Coverage Testing.

User Option: edebug-continue-kbd-macro

If non-nil, continue defining or executing any keyboard macro that is executing outside of Edebug. Use this with caution since it is not debugged. See section Edebug Execution Modes.

User Option: edebug-unwrap-results

If non-nil, Edebug tries to remove any of its own instrumentation when showing the results of expressions. This is relevant when debugging macros where the results of expressions are themselves instrumented expressions. As a very artificial example, suppose that the example function fac has been instrumented, and consider a macro of the form:

(defmacro test () "Edebug example."
  (if (symbol-function 'fac)
      …))

If you instrument the test macro and step through it, then by default the result of the symbol-function call has numerous edebug-after and edebug-before forms, which can make it difficult to see the “actual” result. If edebug-unwrap-results is non-nil, Edebug tries to remove these forms from the result.

User Option: edebug-on-error

Edebug binds debug-on-error to this value, if debug-on-error was previously nil. See section Trapping Errors.

User Option: edebug-on-quit

Edebug binds debug-on-quit to this value, if debug-on-quit was previously nil. See section Trapping Errors.

If you change the values of edebug-on-error or edebug-on-quit while Edebug is active, their values won’t be used until the next time Edebug is invoked via a new command.

User Option: edebug-global-break-condition

If non-nil, an expression to test for at every stop point. If the result is non-nil, then break. Errors are ignored. See section Global Break Condition.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.3 Debugging Invalid Lisp Syntax

The Lisp reader reports invalid syntax, but cannot say where the real problem is. For example, the error “End of file during parsing” in evaluating an expression indicates an excess of open parentheses (or square brackets). The reader detects this imbalance at the end of the file, but it cannot figure out where the close parenthesis should have been. Likewise, “Invalid read syntax: ")"” indicates an excess close parenthesis or missing open parenthesis, but does not say where the missing parenthesis belongs. How, then, to find what to change?

If the problem is not simply an imbalance of parentheses, a useful technique is to try C-M-e at the beginning of each defun, and see if it goes to the place where that defun appears to end. If it does not, there is a problem in that defun.

However, unmatched parentheses are the most common syntax errors in Lisp, and we can give further advice for those cases. (In addition, just moving point through the code with Show Paren mode enabled might find the mismatch.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.3.1 Excess Open Parentheses

The first step is to find the defun that is unbalanced. If there is an excess open parenthesis, the way to do this is to go to the end of the file and type C-u C-M-u. This will move you to the beginning of the first defun that is unbalanced.

The next step is to determine precisely what is wrong. There is no way to be sure of this except by studying the program, but often the existing indentation is a clue to where the parentheses should have been. The easiest way to use this clue is to reindent with C-M-q and see what moves. But don’t do this yet! Keep reading, first.

Before you do this, make sure the defun has enough close parentheses. Otherwise, C-M-q will get an error, or will reindent all the rest of the file until the end. So move to the end of the defun and insert a close parenthesis there. Don’t use C-M-e to move there, since that too will fail to work until the defun is balanced.

Now you can go to the beginning of the defun and type C-M-q. Usually all the lines from a certain point to the end of the function will shift to the right. There is probably a missing close parenthesis, or a superfluous open parenthesis, near that point. (However, don’t assume this is true; study the code to make sure.) Once you have found the discrepancy, undo the C-M-q with C-_, since the old indentation is probably appropriate to the intended parentheses.

After you think you have fixed the problem, use C-M-q again. If the old indentation actually fit the intended nesting of parentheses, and you have put back those parentheses, C-M-q should not change anything.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.3.2 Excess Close Parentheses

To deal with an excess close parenthesis, first go to the beginning of the file, then type C-u -1 C-M-u to find the end of the first unbalanced defun.

Then find the actual matching close parenthesis by typing C-M-f at the beginning of that defun. This will leave you somewhere short of the place where the defun ought to end. It is possible that you will find a spurious close parenthesis in that vicinity.

If you don’t see a problem at that point, the next thing to do is to type C-M-q at the beginning of the defun. A range of lines will probably shift left; if so, the missing open parenthesis or spurious close parenthesis is probably near the first of those lines. (However, don’t assume this is true; study the code to make sure.) Once you have found the discrepancy, undo the C-M-q with C-_, since the old indentation is probably appropriate to the intended parentheses.

After you think you have fixed the problem, use C-M-q again. If the old indentation actually fits the intended nesting of parentheses, and you have put back those parentheses, C-M-q should not change anything.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.4 Test Coverage

You can do coverage testing for a file of Lisp code by loading the testcover library and using the command M-x testcover-start RET file RET to instrument the code. Then test your code by calling it one or more times. Then use the command M-x testcover-mark-all to display colored highlights on the code to show where coverage is insufficient. The command M-x testcover-next-mark will move point forward to the next highlighted spot.

Normally, a red highlight indicates the form was never completely evaluated; a brown highlight means it always evaluated to the same value (meaning there has been little testing of what is done with the result). However, the red highlight is skipped for forms that can’t possibly complete their evaluation, such as error. The brown highlight is skipped for forms that are expected to always evaluate to the same value, such as (setq x 14).

For difficult cases, you can add do-nothing macros to your code to give advice to the test coverage tool.

Macro: 1value form

Evaluate form and return its value, but inform coverage testing that form’s value should always be the same.

Macro: noreturn form

Evaluate form, informing coverage testing that form should never return. If it ever does return, you get a run-time error.

Edebug also has a coverage testing feature (see section Coverage Testing). These features partly duplicate each other, and it would be cleaner to combine them.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.5 Profiling

If your program is working correctly, but you want to make it run more quickly or efficiently, the first thing to do is profile your code so that you know how it is using resources. If you find that one particular function is responsible for a significant portion of the runtime, you can start looking for ways to optimize that piece.

Emacs has built-in support for this. To begin profiling, type M-x profiler-start. You can choose to profile by processor usage, memory usage, or both. After doing some work, type M-x profiler-report to display a summary buffer for each resource that you chose to profile. The names of the report buffers include the times at which the reports were generated, so you can generate another report later on without erasing previous results. When you have finished profiling, type M-x profiler-stop (there is a small overhead associated with profiling).

The profiler report buffer shows, on each line, a function that was called, followed by how much resource (processor or memory) it used in absolute and percentage times since profiling started. If a given line has a ‘+’ symbol at the left-hand side, you can expand that line by typing RET, in order to see the function(s) called by the higher-level function. Pressing RET again will collapse back to the original state.

Press j or mouse-2 to jump to the definition of a function. Press d to view a function’s documentation. You can save a profile to a file using C-x C-w. You can compare two profiles using =.

The elp library offers an alternative approach. See the file elp.el for instructions.

You can check the speed of individual Emacs Lisp forms using the benchmark library. See the functions benchmark-run and benchmark-run-compiled in benchmark.el.

To profile Emacs at the level of its C code, you can build it using the --enable-profiling option of configure. When Emacs exits, it generates a file gmon.out that you can examine using the gprof utility. This feature is mainly useful for debugging Emacs. It actually stops the Lisp-level M-x profiler-… commands described above from working.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18 Reading and Printing Lisp Objects

Printing and reading are the operations of converting Lisp objects to textual form and vice versa. They use the printed representations and read syntax described in Lisp Data Types.

This chapter describes the Lisp functions for reading and printing. It also describes streams, which specify where to get the text (if reading) or where to put it (if printing).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.1 Introduction to Reading and Printing

Reading a Lisp object means parsing a Lisp expression in textual form and producing a corresponding Lisp object. This is how Lisp programs get into Lisp from files of Lisp code. We call the text the read syntax of the object. For example, the text ‘(a . 5)’ is the read syntax for a cons cell whose CAR is a and whose CDR is the number 5.

Printing a Lisp object means producing text that represents that object—converting the object to its printed representation (see section Printed Representation and Read Syntax). Printing the cons cell described above produces the text ‘(a . 5)’.

Reading and printing are more or less inverse operations: printing the object that results from reading a given piece of text often produces the same text, and reading the text that results from printing an object usually produces a similar-looking object. For example, printing the symbol foo produces the text ‘foo’, and reading that text returns the symbol foo. Printing a list whose elements are a and b produces the text ‘(a b)’, and reading that text produces a list (but not the same list) with elements a and b.

However, these two operations are not precisely inverse to each other. There are three kinds of exceptions:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.2 Input Streams

Most of the Lisp functions for reading text take an input stream as an argument. The input stream specifies where or how to get the characters of the text to be read. Here are the possible types of input stream:

buffer

The input characters are read from buffer, starting with the character directly after point. Point advances as characters are read.

marker

The input characters are read from the buffer that marker is in, starting with the character directly after the marker. The marker position advances as characters are read. The value of point in the buffer has no effect when the stream is a marker.

string

The input characters are taken from string, starting at the first character in the string and using as many characters as required.

function

The input characters are generated by function, which must support two kinds of calls:

t

t used as a stream means that the input is read from the minibuffer. In fact, the minibuffer is invoked once and the text given by the user is made into a string that is then used as the input stream. If Emacs is running in batch mode, standard input is used instead of the minibuffer. For example,

(message "%s" (read t))

will read a Lisp expression from standard input and print the result to standard output.

nil

nil supplied as an input stream means to use the value of standard-input instead; that value is the default input stream, and must be a non-nil input stream.

symbol

A symbol as input stream is equivalent to the symbol’s function definition (if any).

Here is an example of reading from a stream that is a buffer, showing where point is located before and after:

---------- Buffer: foo ----------
This∗ is the contents of foo.
---------- Buffer: foo ----------
(read (get-buffer "foo"))
     ⇒ is
(read (get-buffer "foo"))
     ⇒ the
---------- Buffer: foo ----------
This is the∗ contents of foo.
---------- Buffer: foo ----------

Note that the first read skips a space. Reading skips any amount of whitespace preceding the significant text.

Here is an example of reading from a stream that is a marker, initially positioned at the beginning of the buffer shown. The value read is the symbol This.

---------- Buffer: foo ----------
This is the contents of foo.
---------- Buffer: foo ----------
(setq m (set-marker (make-marker) 1 (get-buffer "foo")))
     ⇒ #<marker at 1 in foo>
(read m)
     ⇒ This
m
     ⇒ #<marker at 5 in foo>   ;; Before the first space.

Here we read from the contents of a string:

(read "(When in) the course")
     ⇒ (When in)

The following example reads from the minibuffer. The prompt is: ‘Lisp expression: . (That is always the prompt used when you read from the stream t.) The user’s input is shown following the prompt.

(read t)
     ⇒ 23
---------- Buffer: Minibuffer ----------
Lisp expression: 23 RET
---------- Buffer: Minibuffer ----------

Finally, here is an example of a stream that is a function, named useless-stream. Before we use the stream, we initialize the variable useless-list to a list of characters. Then each call to the function useless-stream obtains the next character in the list or unreads a character by adding it to the front of the list.

(setq useless-list (append "XY()" nil))
     ⇒ (88 89 40 41)
(defun useless-stream (&optional unread)
  (if unread
      (setq useless-list (cons unread useless-list))
    (prog1 (car useless-list)
           (setq useless-list (cdr useless-list)))))
     ⇒ useless-stream

Now we read using the stream thus constructed:

(read 'useless-stream)
     ⇒ XY
useless-list
     ⇒ (40 41)

Note that the open and close parentheses remain in the list. The Lisp reader encountered the open parenthesis, decided that it ended the input, and unread it. Another attempt to read from the stream at this point would read ‘()’ and return nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3 Input Functions

This section describes the Lisp functions and variables that pertain to reading.

In the functions below, stream stands for an input stream (see the previous section). If stream is nil or omitted, it defaults to the value of standard-input.

An end-of-file error is signaled if reading encounters an unterminated list, vector, or string.

Function: read &optional stream

This function reads one textual Lisp expression from stream, returning it as a Lisp object. This is the basic Lisp input function.

Function: read-from-string string &optional start end

This function reads the first textual Lisp expression from the text in string. It returns a cons cell whose CAR is that expression, and whose CDR is an integer giving the position of the next remaining character in the string (i.e., the first one not read).

If start is supplied, then reading begins at index start in the string (where the first character is at index 0). If you specify end, then reading is forced to stop just before that index, as if the rest of the string were not there.

For example:

(read-from-string "(setq x 55) (setq y 5)")
     ⇒ ((setq x 55) . 11)
(read-from-string "\"A short string\"")
     ⇒ ("A short string" . 16)
;; Read starting at the first character.
(read-from-string "(list 112)" 0)
     ⇒ ((list 112) . 10)
;; Read starting at the second character.
(read-from-string "(list 112)" 1)
     ⇒ (list . 5)
;; Read starting at the seventh character,
;;   and stopping at the ninth.
(read-from-string "(list 112)" 6 8)
     ⇒ (11 . 8)
Variable: standard-input

This variable holds the default input stream—the stream that read uses when the stream argument is nil. The default is t, meaning use the minibuffer.

Variable: read-circle

If non-nil, this variable enables the reading of circular and shared structures. See section Read Syntax for Circular Objects. Its default value is t.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.4 Output Streams

An output stream specifies what to do with the characters produced by printing. Most print functions accept an output stream as an optional argument. Here are the possible types of output stream:

buffer

The output characters are inserted into buffer at point. Point advances as characters are inserted.

marker

The output characters are inserted into the buffer that marker points into, at the marker position. The marker position advances as characters are inserted. The value of point in the buffer has no effect on printing when the stream is a marker, and this kind of printing does not move point (except that if the marker points at or before the position of point, point advances with the surrounding text, as usual).

function

The output characters are passed to function, which is responsible for storing them away. It is called with a single character as argument, as many times as there are characters to be output, and is responsible for storing the characters wherever you want to put them.

t

The output characters are displayed in the echo area.

nil

nil specified as an output stream means to use the value of standard-output instead; that value is the default output stream, and must not be nil.

symbol

A symbol as output stream is equivalent to the symbol’s function definition (if any).

Many of the valid output streams are also valid as input streams. The difference between input and output streams is therefore more a matter of how you use a Lisp object, than of different types of object.

Here is an example of a buffer used as an output stream. Point is initially located as shown immediately before the ‘h’ in ‘the’. At the end, point is located directly before that same ‘h’.

---------- Buffer: foo ----------
This is t∗he contents of foo.
---------- Buffer: foo ----------
(print "This is the output" (get-buffer "foo"))
     ⇒ "This is the output"

---------- Buffer: foo ----------
This is t
"This is the output"
∗he contents of foo.
---------- Buffer: foo ----------

Now we show a use of a marker as an output stream. Initially, the marker is in buffer foo, between the ‘t’ and the ‘h’ in the word ‘the’. At the end, the marker has advanced over the inserted text so that it remains positioned before the same ‘h’. Note that the location of point, shown in the usual fashion, has no effect.

---------- Buffer: foo ----------
This is the ∗output
---------- Buffer: foo ----------
(setq m (copy-marker 10))
     ⇒ #<marker at 10 in foo>
(print "More output for foo." m)
     ⇒ "More output for foo."
---------- Buffer: foo ----------
This is t
"More output for foo."
he ∗output
---------- Buffer: foo ----------
m
     ⇒ #<marker at 34 in foo>

The following example shows output to the echo area:

(print "Echo Area output" t)
     ⇒ "Echo Area output"
---------- Echo Area ----------
"Echo Area output"
---------- Echo Area ----------

Finally, we show the use of a function as an output stream. The function eat-output takes each character that it is given and conses it onto the front of the list last-output (see section Building Cons Cells and Lists). At the end, the list contains all the characters output, but in reverse order.

(setq last-output nil)
     ⇒ nil
(defun eat-output (c)
  (setq last-output (cons c last-output)))
     ⇒ eat-output
(print "This is the output" 'eat-output)
     ⇒ "This is the output"
last-output
     ⇒ (10 34 116 117 112 116 117 111 32 101 104
    116 32 115 105 32 115 105 104 84 34 10)

Now we can put the output in the proper order by reversing the list:

(concat (nreverse last-output))
     ⇒ "
\"This is the output\"
"

Calling concat converts the list to a string so you can see its contents more clearly.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.5 Output Functions

This section describes the Lisp functions for printing Lisp objects—converting objects into their printed representation.

Some of the Emacs printing functions add quoting characters to the output when necessary so that it can be read properly. The quoting characters used are ‘"’ and ‘\’; they distinguish strings from symbols, and prevent punctuation characters in strings and symbols from being taken as delimiters when reading. See section Printed Representation and Read Syntax, for full details. You specify quoting or no quoting by the choice of printing function.

If the text is to be read back into Lisp, then you should print with quoting characters to avoid ambiguity. Likewise, if the purpose is to describe a Lisp object clearly for a Lisp programmer. However, if the purpose of the output is to look nice for humans, then it is usually better to print without quoting.

Lisp objects can refer to themselves. Printing a self-referential object in the normal way would require an infinite amount of text, and the attempt could cause infinite recursion. Emacs detects such recursion and prints ‘#level’ instead of recursively printing an object already being printed. For example, here ‘#0’ indicates a recursive reference to the object at level 0 of the current print operation:

(setq foo (list nil))
     ⇒ (nil)
(setcar foo foo)
     ⇒ (#0)

In the functions below, stream stands for an output stream. (See the previous section for a description of output streams.) If stream is nil or omitted, it defaults to the value of standard-output.

Function: print object &optional stream

The print function is a convenient way of printing. It outputs the printed representation of object to stream, printing in addition one newline before object and another after it. Quoting characters are used. print returns object. For example:

(progn (print 'The\ cat\ in)
       (print "the hat")
       (print " came back"))
     -|
     -| The\ cat\ in
     -|
     -| "the hat"
     -|
     -| " came back"
     ⇒ " came back"
Function: prin1 object &optional stream

This function outputs the printed representation of object to stream. It does not print newlines to separate output as print does, but it does use quoting characters just like print. It returns object.

(progn (prin1 'The\ cat\ in)
       (prin1 "the hat")
       (prin1 " came back"))
     -| The\ cat\ in"the hat"" came back"
     ⇒ " came back"
Function: princ object &optional stream

This function outputs the printed representation of object to stream. It returns object.

This function is intended to produce output that is readable by people, not by read, so it doesn’t insert quoting characters and doesn’t put double-quotes around the contents of strings. It does not add any spacing between calls.

(progn
  (princ 'The\ cat)
  (princ " in the \"hat\""))
     -| The cat in the "hat"
     ⇒ " in the \"hat\""
Function: terpri &optional stream

This function outputs a newline to stream. The name stands for “terminate print”.

Function: write-char character &optional stream

This function outputs character to stream. It returns character.

Function: prin1-to-string object &optional noescape

This function returns a string containing the text that prin1 would have printed for the same argument.

(prin1-to-string 'foo)
     ⇒ "foo"
(prin1-to-string (mark-marker))
     ⇒ "#<marker at 2773 in strings.texi>"

If noescape is non-nil, that inhibits use of quoting characters in the output. (This argument is supported in Emacs versions 19 and later.)

(prin1-to-string "foo")
     ⇒ "\"foo\""
(prin1-to-string "foo" t)
     ⇒ "foo"

See format, in Formatting Strings, for other ways to obtain the printed representation of a Lisp object as a string.

Macro: with-output-to-string body…

This macro executes the body forms with standard-output set up to feed output into a string. Then it returns that string.

For example, if the current buffer name is ‘foo’,

(with-output-to-string
  (princ "The buffer is ")
  (princ (buffer-name)))

returns "The buffer is foo".

Function: pp object &optional stream

This function outputs object to stream, just like prin1, but does it in a more “pretty” way. That is, it’ll indent and fill the object to make it more readable for humans.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.6 Variables Affecting Output

Variable: standard-output

The value of this variable is the default output stream—the stream that print functions use when the stream argument is nil. The default is t, meaning display in the echo area.

Variable: print-quoted

If this is non-nil, that means to print quoted forms using abbreviated reader syntax, e.g., (quote foo) prints as 'foo, and (function foo) as #'foo.

Variable: print-escape-newlines

If this variable is non-nil, then newline characters in strings are printed as ‘\n’ and formfeeds are printed as ‘\f’. Normally these characters are printed as actual newlines and formfeeds.

This variable affects the print functions prin1 and print that print with quoting. It does not affect princ. Here is an example using prin1:

(prin1 "a\nb")
     -| "a
     -| b"
     ⇒ "a
b"
(let ((print-escape-newlines t))
  (prin1 "a\nb"))
     -| "a\nb"
     ⇒ "a
b"

In the second expression, the local binding of print-escape-newlines is in effect during the call to prin1, but not during the printing of the result.

Variable: print-escape-nonascii

If this variable is non-nil, then unibyte non-ASCII characters in strings are unconditionally printed as backslash sequences by the print functions prin1 and print that print with quoting.

Those functions also use backslash sequences for unibyte non-ASCII characters, regardless of the value of this variable, when the output stream is a multibyte buffer or a marker pointing into one.

Variable: print-escape-multibyte

If this variable is non-nil, then multibyte non-ASCII characters in strings are unconditionally printed as backslash sequences by the print functions prin1 and print that print with quoting.

Those functions also use backslash sequences for multibyte non-ASCII characters, regardless of the value of this variable, when the output stream is a unibyte buffer or a marker pointing into one.

Variable: print-length

The value of this variable is the maximum number of elements to print in any list, vector or bool-vector. If an object being printed has more than this many elements, it is abbreviated with an ellipsis.

If the value is nil (the default), then there is no limit.

(setq print-length 2)
     ⇒ 2
(print '(1 2 3 4 5))
     -| (1 2 ...)
     ⇒ (1 2 ...)
Variable: print-level

The value of this variable is the maximum depth of nesting of parentheses and brackets when printed. Any list or vector at a depth exceeding this limit is abbreviated with an ellipsis. A value of nil (which is the default) means no limit.

User Option: eval-expression-print-length
User Option: eval-expression-print-level

These are the values for print-length and print-level used by eval-expression, and thus, indirectly, by many interactive evaluation commands (see Evaluating Emacs-Lisp Expressions in The GNU Emacs Manual).

These variables are used for detecting and reporting circular and shared structure:

Variable: print-circle

If non-nil, this variable enables detection of circular and shared structure in printing. See section Read Syntax for Circular Objects.

Variable: print-gensym

If non-nil, this variable enables detection of uninterned symbols (see section Creating and Interning Symbols) in printing. When this is enabled, uninterned symbols print with the prefix ‘#:’, which tells the Lisp reader to produce an uninterned symbol.

Variable: print-continuous-numbering

If non-nil, that means number continuously across print calls. This affects the numbers printed for ‘#n=’ labels and ‘#m#’ references. Don’t set this variable with setq; you should only bind it temporarily to t with let. When you do that, you should also bind print-number-table to nil.

Variable: print-number-table

This variable holds a vector used internally by printing to implement the print-circle feature. You should not use it except to bind it to nil when you bind print-continuous-numbering.

Variable: float-output-format

This variable specifies how to print floating-point numbers. The default is nil, meaning use the shortest output that represents the number without losing information.

To control output format more precisely, you can put a string in this variable. The string should hold a ‘%’-specification to be used in the C function sprintf. For further restrictions on what you can use, see the variable’s documentation string.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19 Minibuffers

A minibuffer is a special buffer that Emacs commands use to read arguments more complicated than the single numeric prefix argument. These arguments include file names, buffer names, and command names (as in M-x). The minibuffer is displayed on the bottom line of the frame, in the same place as the echo area (see section The Echo Area), but only while it is in use for reading an argument.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.1 Introduction to Minibuffers

In most ways, a minibuffer is a normal Emacs buffer. Most operations within a buffer, such as editing commands, work normally in a minibuffer. However, many operations for managing buffers do not apply to minibuffers. The name of a minibuffer always has the form ‘ *Minibuf-number*, and it cannot be changed. Minibuffers are displayed only in special windows used only for minibuffers; these windows always appear at the bottom of a frame. (Sometimes frames have no minibuffer window, and sometimes a special kind of frame contains nothing but a minibuffer window; see Minibuffers and Frames.)

The text in the minibuffer always starts with the prompt string, the text that was specified by the program that is using the minibuffer to tell the user what sort of input to type. This text is marked read-only so you won’t accidentally delete or change it. It is also marked as a field (see section Defining and Using Fields), so that certain motion functions, including beginning-of-line, forward-word, forward-sentence, and forward-paragraph, stop at the boundary between the prompt and the actual text.

The minibuffer’s window is normally a single line; it grows automatically if the contents require more space. Whilst it is active, you can explicitly resize it temporarily with the window sizing commands; it reverts to its normal size when the minibuffer is exited. When the minibuffer is not active, you can resize it permanently by using the window sizing commands in the frame’s other window, or dragging the mode line with the mouse. (Due to details of the current implementation, for this to work resize-mini-windows must be nil.) If the frame contains just a minibuffer, you can change the minibuffer’s size by changing the frame’s size.

Use of the minibuffer reads input events, and that alters the values of variables such as this-command and last-command (see section Information from the Command Loop). Your program should bind them around the code that uses the minibuffer, if you do not want that to change them.

Under some circumstances, a command can use a minibuffer even if there is an active minibuffer; such a minibuffer is called a recursive minibuffer. The first minibuffer is named ‘ *Minibuf-1*. Recursive minibuffers are named by incrementing the number at the end of the name. (The names begin with a space so that they won’t show up in normal buffer lists.) Of several recursive minibuffers, the innermost (or most recently entered) is the active minibuffer. We usually call this “the” minibuffer. You can permit or forbid recursive minibuffers by setting the variable enable-recursive-minibuffers, or by putting properties of that name on command symbols (See section Recursive Minibuffers.)

Like other buffers, a minibuffer uses a local keymap (see section Keymaps) to specify special key bindings. The function that invokes the minibuffer also sets up its local map according to the job to be done. See section Reading Text Strings with the Minibuffer, for the non-completion minibuffer local maps. See section Minibuffer Commands that Do Completion, for the minibuffer local maps for completion.

When a minibuffer is inactive, its major mode is minibuffer-inactive-mode, with keymap minibuffer-inactive-mode-map. This is only really useful if the minibuffer is in a separate frame. See section Minibuffers and Frames.

When Emacs is running in batch mode, any request to read from the minibuffer actually reads a line from the standard input descriptor that was supplied when Emacs was started. This supports only basic input: none of the special minibuffer features (history, completion, password hiding, etc.) are available in batch mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.2 Reading Text Strings with the Minibuffer

The most basic primitive for minibuffer input is read-from-minibuffer, which can be used to read either a string or a Lisp object in textual form. The function read-regexp is used for reading regular expressions (see section Regular Expressions), which are a special kind of string. There are also specialized functions for reading commands, variables, file names, etc. (see section Completion).

In most cases, you should not call minibuffer input functions in the middle of a Lisp function. Instead, do all minibuffer input as part of reading the arguments for a command, in the interactive specification. See section Defining Commands.

Function: read-from-minibuffer prompt &optional initial keymap read history default inherit-input-method

This function is the most general way to get input from the minibuffer. By default, it accepts arbitrary text and returns it as a string; however, if read is non-nil, then it uses read to convert the text into a Lisp object (see section Input Functions).

The first thing this function does is to activate a minibuffer and display it with prompt (which must be a string) as the prompt. Then the user can edit text in the minibuffer.

When the user types a command to exit the minibuffer, read-from-minibuffer constructs the return value from the text in the minibuffer. Normally it returns a string containing that text. However, if read is non-nil, read-from-minibuffer reads the text and returns the resulting Lisp object, unevaluated. (See section Input Functions, for information about reading.)

The argument default specifies default values to make available through the history commands. It should be a string, a list of strings, or nil. The string or strings become the minibuffer’s “future history”, available to the user with M-n.

If read is non-nil, then default is also used as the input to read, if the user enters empty input. If default is a list of strings, the first string is used as the input. If default is nil, empty input results in an end-of-file error. However, in the usual case (where read is nil), read-from-minibuffer ignores default when the user enters empty input and returns an empty string, "". In this respect, it differs from all the other minibuffer input functions in this chapter.

If keymap is non-nil, that keymap is the local keymap to use in the minibuffer. If keymap is omitted or nil, the value of minibuffer-local-map is used as the keymap. Specifying a keymap is the most important way to customize the minibuffer for various applications such as completion.

The argument history specifies a history list variable to use for saving the input and for history commands used in the minibuffer. It defaults to minibuffer-history. You can optionally specify a starting position in the history list as well. See section Minibuffer History.

If the variable minibuffer-allow-text-properties is non-nil, then the string that is returned includes whatever text properties were present in the minibuffer. Otherwise all the text properties are stripped when the value is returned.

If the argument inherit-input-method is non-nil, then the minibuffer inherits the current input method (see section Input Methods) and the setting of enable-multibyte-characters (see section Text Representations) from whichever buffer was current before entering the minibuffer.

Use of initial is mostly deprecated; we recommend using a non-nil value only in conjunction with specifying a cons cell for history. See section Initial Input.

Function: read-string prompt &optional initial history default inherit-input-method

This function reads a string from the minibuffer and returns it. The arguments prompt, initial, history and inherit-input-method are used as in read-from-minibuffer. The keymap used is minibuffer-local-map.

The optional argument default is used as in read-from-minibuffer, except that, if non-nil, it also specifies a default value to return if the user enters null input. As in read-from-minibuffer it should be a string, a list of strings, or nil, which is equivalent to an empty string. When default is a string, that string is the default value. When it is a list of strings, the first string is the default value. (All these strings are available to the user in the “future minibuffer history”.)

This function works by calling the read-from-minibuffer function:

(read-string prompt initial history default inherit)
≡
(let ((value
       (read-from-minibuffer prompt initial nil nil
                             history default inherit)))
  (if (and (equal value "") default)
      (if (consp default) (car default) default)
    value))
Function: read-regexp prompt &optional defaults history

This function reads a regular expression as a string from the minibuffer and returns it. If the minibuffer prompt string prompt does not end in ‘:’ (followed by optional whitespace), the function adds ‘: ’ to the end, preceded by the default return value (see below), if that is non-empty.

The optional argument defaults controls the default value to return if the user enters null input, and should be one of: a string; nil, which is equivalent to an empty string; a list of strings; or a symbol.

If defaults is a symbol, read-regexp consults the value of the variable read-regexp-defaults-function (see below), and if that is non-nil uses it in preference to defaults. The value in this case should be either:

read-regexp now ensures that the result of processing defaults is a list (i.e., if the value is nil or a string, it converts it to a list of one element). To this list, read-regexp then appends a few potentially useful candidates for input. These are:

The function now has a list of regular expressions that it passes to read-from-minibuffer to obtain the user’s input. The first element of the list is the default result in case of empty input. All elements of the list are available to the user as the “future minibuffer history list” (see future list in The GNU Emacs Manual).

The optional argument history, if non-nil, is a symbol specifying a minibuffer history list to use (see section Minibuffer History). If it is omitted or nil, the history list defaults to regexp-history.

Variable: read-regexp-defaults-function

The function read-regexp may use the value of this variable to determine its list of default regular expressions. If non-nil, the value of this variable should be either:

See read-regexp above for details of how these values are used.

Variable: minibuffer-allow-text-properties

If this variable is nil, then read-from-minibuffer and read-string strip all text properties from the minibuffer input before returning it. However, read-no-blanks-input (see below), as well as read-minibuffer and related functions (see section Reading Lisp Objects With the Minibuffer), and all functions that do minibuffer input with completion, discard text properties unconditionally, regardless of the value of this variable.

Variable: minibuffer-local-map

This is the default local keymap for reading from the minibuffer. By default, it makes the following bindings:

C-j

exit-minibuffer

RET

exit-minibuffer

C-g

abort-recursive-edit

M-n
DOWN

next-history-element

M-p
UP

previous-history-element

M-s

next-matching-history-element

M-r

previous-matching-history-element

Function: read-no-blanks-input prompt &optional initial inherit-input-method

This function reads a string from the minibuffer, but does not allow whitespace characters as part of the input: instead, those characters terminate the input. The arguments prompt, initial, and inherit-input-method are used as in read-from-minibuffer.

This is a simplified interface to the read-from-minibuffer function, and passes the value of the minibuffer-local-ns-map keymap as the keymap argument for that function. Since the keymap minibuffer-local-ns-map does not rebind C-q, it is possible to put a space into the string, by quoting it.

This function discards text properties, regardless of the value of minibuffer-allow-text-properties.

(read-no-blanks-input prompt initial)
≡
(let (minibuffer-allow-text-properties)
  (read-from-minibuffer prompt initial minibuffer-local-ns-map))
Variable: minibuffer-local-ns-map

This built-in variable is the keymap used as the minibuffer local keymap in the function read-no-blanks-input. By default, it makes the following bindings, in addition to those of minibuffer-local-map:

SPC

exit-minibuffer

TAB

exit-minibuffer

?

self-insert-and-exit


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.3 Reading Lisp Objects with the Minibuffer

This section describes functions for reading Lisp objects with the minibuffer.

Function: read-minibuffer prompt &optional initial

This function reads a Lisp object using the minibuffer, and returns it without evaluating it. The arguments prompt and initial are used as in read-from-minibuffer.

This is a simplified interface to the read-from-minibuffer function:

(read-minibuffer prompt initial)
≡
(let (minibuffer-allow-text-properties)
  (read-from-minibuffer prompt initial nil t))

Here is an example in which we supply the string "(testing)" as initial input:

(read-minibuffer
 "Enter an expression: " (format "%s" '(testing)))

;; Here is how the minibuffer is displayed:
---------- Buffer: Minibuffer ----------
Enter an expression: (testing)∗
---------- Buffer: Minibuffer ----------

The user can type RET immediately to use the initial input as a default, or can edit the input.

Function: eval-minibuffer prompt &optional initial

This function reads a Lisp expression using the minibuffer, evaluates it, then returns the result. The arguments prompt and initial are used as in read-from-minibuffer.

This function simply evaluates the result of a call to read-minibuffer:

(eval-minibuffer prompt initial)
≡
(eval (read-minibuffer prompt initial))
Function: edit-and-eval-command prompt form

This function reads a Lisp expression in the minibuffer, evaluates it, then returns the result. The difference between this command and eval-minibuffer is that here the initial form is not optional and it is treated as a Lisp object to be converted to printed representation rather than as a string of text. It is printed with prin1, so if it is a string, double-quote characters (‘"’) appear in the initial text. See section Output Functions.

In the following example, we offer the user an expression with initial text that is already a valid form:

(edit-and-eval-command "Please edit: " '(forward-word 1))

;; After evaluation of the preceding expression,
;;   the following appears in the minibuffer:
---------- Buffer: Minibuffer ----------
Please edit: (forward-word 1)∗
---------- Buffer: Minibuffer ----------

Typing RET right away would exit the minibuffer and evaluate the expression, thus moving point forward one word.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.4 Minibuffer History

A minibuffer history list records previous minibuffer inputs so the user can reuse them conveniently. It is a variable whose value is a list of strings (previous inputs), most recent first.

There are many separate minibuffer history lists, used for different kinds of inputs. It’s the Lisp programmer’s job to specify the right history list for each use of the minibuffer.

You specify a minibuffer history list with the optional history argument to read-from-minibuffer or completing-read. Here are the possible values for it:

variable

Use variable (a symbol) as the history list.

(variable . startpos)

Use variable (a symbol) as the history list, and assume that the initial history position is startpos (a nonnegative integer).

Specifying 0 for startpos is equivalent to just specifying the symbol variable. previous-history-element will display the most recent element of the history list in the minibuffer. If you specify a positive startpos, the minibuffer history functions behave as if (elt variable (1- startpos)) were the history element currently shown in the minibuffer.

For consistency, you should also specify that element of the history as the initial minibuffer contents, using the initial argument to the minibuffer input function (see section Initial Input).

If you don’t specify history, then the default history list minibuffer-history is used. For other standard history lists, see below. You can also create your own history list variable; just initialize it to nil before the first use.

Both read-from-minibuffer and completing-read add new elements to the history list automatically, and provide commands to allow the user to reuse items on the list. The only thing your program needs to do to use a history list is to initialize it and to pass its name to the input functions when you wish. But it is safe to modify the list by hand when the minibuffer input functions are not using it.

Emacs functions that add a new element to a history list can also delete old elements if the list gets too long. The variable history-length specifies the maximum length for most history lists. To specify a different maximum length for a particular history list, put the length in the history-length property of the history list symbol. The variable history-delete-duplicates specifies whether to delete duplicates in history.

Function: add-to-history history-var newelt &optional maxelt keep-all

This function adds a new element newelt, if it isn’t the empty string, to the history list stored in the variable history-var, and returns the updated history list. It limits the list length to the value of maxelt (if non-nil) or history-length (described below). The possible values of maxelt have the same meaning as the values of history-length.

Normally, add-to-history removes duplicate members from the history list if history-delete-duplicates is non-nil. However, if keep-all is non-nil, that says not to remove duplicates, and to add newelt to the list even if it is empty.

Variable: history-add-new-input

If the value of this variable is nil, standard functions that read from the minibuffer don’t add new elements to the history list. This lets Lisp programs explicitly manage input history by using add-to-history. The default value is t.

User Option: history-length

The value of this variable specifies the maximum length for all history lists that don’t specify their own maximum lengths. If the value is t, that means there is no maximum (don’t delete old elements). If a history list variable’s symbol has a non-nil history-length property, it overrides this variable for that particular history list.

User Option: history-delete-duplicates

If the value of this variable is t, that means when adding a new history element, all previous identical elements are deleted.

Here are some of the standard minibuffer history list variables:

Variable: minibuffer-history

The default history list for minibuffer history input.

Variable: query-replace-history

A history list for arguments to query-replace (and similar arguments to other commands).

Variable: file-name-history

A history list for file-name arguments.

Variable: buffer-name-history

A history list for buffer-name arguments.

Variable: regexp-history

A history list for regular expression arguments.

Variable: extended-command-history

A history list for arguments that are names of extended commands.

Variable: shell-command-history

A history list for arguments that are shell commands.

Variable: read-expression-history

A history list for arguments that are Lisp expressions to evaluate.

Variable: face-name-history

A history list for arguments that are faces.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.5 Initial Input

Several of the functions for minibuffer input have an argument called initial. This is a mostly-deprecated feature for specifying that the minibuffer should start out with certain text, instead of empty as usual.

If initial is a string, the minibuffer starts out containing the text of the string, with point at the end, when the user starts to edit the text. If the user simply types RET to exit the minibuffer, it will use the initial input string to determine the value to return.

We discourage use of a non-nil value for initial, because initial input is an intrusive interface. History lists and default values provide a much more convenient method to offer useful default inputs to the user.

There is just one situation where you should specify a string for an initial argument. This is when you specify a cons cell for the history argument. See section Minibuffer History.

initial can also be a cons cell of the form (string . position). This means to insert string in the minibuffer but put point at position within the string’s text.

As a historical accident, position was implemented inconsistently in different functions. In completing-read, position’s value is interpreted as origin-zero; that is, a value of 0 means the beginning of the string, 1 means after the first character, etc. In read-minibuffer, and the other non-completion minibuffer input functions that support this argument, 1 means the beginning of the string, 2 means after the first character, etc.

Use of a cons cell as the value for initial arguments is deprecated.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6 Completion

Completion is a feature that fills in the rest of a name starting from an abbreviation for it. Completion works by comparing the user’s input against a list of valid names and determining how much of the name is determined uniquely by what the user has typed. For example, when you type C-x b (switch-to-buffer) and then type the first few letters of the name of the buffer to which you wish to switch, and then type TAB (minibuffer-complete), Emacs extends the name as far as it can.

Standard Emacs commands offer completion for names of symbols, files, buffers, and processes; with the functions in this section, you can implement completion for other kinds of names.

The try-completion function is the basic primitive for completion: it returns the longest determined completion of a given initial string, with a given set of strings to match against.

The function completing-read provides a higher-level interface for completion. A call to completing-read specifies how to determine the list of valid names. The function then activates the minibuffer with a local keymap that binds a few keys to commands useful for completion. Other functions provide convenient simple interfaces for reading certain kinds of names with completion.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.1 Basic Completion Functions

The following completion functions have nothing in themselves to do with minibuffers. We describe them here to keep them near the higher-level completion features that do use the minibuffer.

Function: try-completion string collection &optional predicate

This function returns the longest common substring of all possible completions of string in collection.

collection is called the completion table. Its value must be a list of strings or cons cells, an obarray, a hash table, or a completion function.

try-completion compares string against each of the permissible completions specified by the completion table. If no permissible completions match, it returns nil. If there is just one matching completion, and the match is exact, it returns t. Otherwise, it returns the longest initial sequence common to all possible matching completions.

If collection is a list, the permissible completions are specified by the elements of the list, each of which should be either a string, or a cons cell whose CAR is either a string or a symbol (a symbol is converted to a string using symbol-name). If the list contains elements of any other type, those are ignored.

If collection is an obarray (see section Creating and Interning Symbols), the names of all symbols in the obarray form the set of permissible completions.

If collection is a hash table, then the keys that are strings are the possible completions. Other keys are ignored.

You can also use a function as collection. Then the function is solely responsible for performing completion; try-completion returns whatever this function returns. The function is called with three arguments: string, predicate and nil (the third argument is so that the same function can be used in all-completions and do the appropriate thing in either case). See section Programmed Completion.

If the argument predicate is non-nil, then it must be a function of one argument, unless collection is a hash table, in which case it should be a function of two arguments. It is used to test each possible match, and the match is accepted only if predicate returns non-nil. The argument given to predicate is either a string or a cons cell (the CAR of which is a string) from the alist, or a symbol (not a symbol name) from the obarray. If collection is a hash table, predicate is called with two arguments, the string key and the associated value.

In addition, to be acceptable, a completion must also match all the regular expressions in completion-regexp-list. (Unless collection is a function, in which case that function has to handle completion-regexp-list itself.)

In the first of the following examples, the string ‘foo’ is matched by three of the alist CARs. All of the matches begin with the characters ‘fooba’, so that is the result. In the second example, there is only one possible match, and it is exact, so the return value is t.

(try-completion
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)))
     ⇒ "fooba"
(try-completion "foo" '(("barfoo" 2) ("foo" 3)))
     ⇒ t

In the following example, numerous symbols begin with the characters ‘forw’, and all of them begin with the word ‘forward’. In most of the symbols, this is followed with a ‘-’, but not in all, so no more than ‘forward’ can be completed.

(try-completion "forw" obarray)
     ⇒ "forward"

Finally, in the following example, only two of the three possible matches pass the predicate test (the string ‘foobaz’ is too short). Both of those begin with the string ‘foobar’.

(defun test (s)
  (> (length (car s)) 6))
     ⇒ test
(try-completion
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 'test)
     ⇒ "foobar"
Function: all-completions string collection &optional predicate

This function returns a list of all possible completions of string. The arguments to this function are the same as those of try-completion, and it uses completion-regexp-list in the same way that try-completion does.

If collection is a function, it is called with three arguments: string, predicate and t; then all-completions returns whatever the function returns. See section Programmed Completion.

Here is an example, using the function test shown in the example for try-completion:

(defun test (s)
  (> (length (car s)) 6))
     ⇒ test
(all-completions
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 'test)
     ⇒ ("foobar1" "foobar2")
Function: test-completion string collection &optional predicate

This function returns non-nil if string is a valid completion alternative specified by collection and predicate. The arguments are the same as in try-completion. For instance, if collection is a list of strings, this is true if string appears in the list and predicate is satisfied.

This function uses completion-regexp-list in the same way that try-completion does.

If predicate is non-nil and if collection contains several strings that are equal to each other, as determined by compare-strings according to completion-ignore-case, then predicate should accept either all or none of them. Otherwise, the return value of test-completion is essentially unpredictable.

If collection is a function, it is called with three arguments, the values string, predicate and lambda; whatever it returns, test-completion returns in turn.

Function: completion-boundaries string collection predicate suffix

This function returns the boundaries of the field on which collection will operate, assuming that string holds the text before point and suffix holds the text after point.

Normally completion operates on the whole string, so for all normal collections, this will always return (0 . (length suffix)). But more complex completion such as completion on files is done one field at a time. For example, completion of "/usr/sh" will include "/usr/share/" but not "/usr/share/doc" even if "/usr/share/doc" exists. Also all-completions on "/usr/sh" will not include "/usr/share/" but only "share/". So if string is "/usr/sh" and suffix is "e/doc", completion-boundaries will return (5 . 1) which tells us that the collection will only return completion information that pertains to the area after "/usr/" and before "/doc".

If you store a completion alist in a variable, you should mark the variable as “risky” by giving it a non-nil risky-local-variable property. See section File Local Variables.

Variable: completion-ignore-case

If the value of this variable is non-nil, case is not considered significant in completion. Within read-file-name, this variable is overridden by read-file-name-completion-ignore-case (see section Reading File Names); within read-buffer, it is overridden by read-buffer-completion-ignore-case (see section High-Level Completion Functions).

Variable: completion-regexp-list

This is a list of regular expressions. The completion functions only consider a completion acceptable if it matches all regular expressions in this list, with case-fold-search (see section Searching and Case) bound to the value of completion-ignore-case.

Macro: lazy-completion-table var fun

This macro provides a way to initialize the variable var as a collection for completion in a lazy way, not computing its actual contents until they are first needed. You use this macro to produce a value that you store in var. The actual computation of the proper value is done the first time you do completion using var. It is done by calling fun with no arguments. The value fun returns becomes the permanent value of var.

Here is an example:

(defvar foo (lazy-completion-table foo make-my-alist))

There are several functions that take an existing completion table and return a modified version. completion-table-case-fold returns a case-insensitive table. completion-table-in-turn and completion-table-merge combine multiple input tables in different ways. completion-table-subvert alters a table to use a different initial prefix. completion-table-with-quoting returns a table suitable for operating on quoted text. completion-table-with-predicate filters a table with a predicate function. completion-table-with-terminator adds a terminating string.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.2 Completion and the Minibuffer

This section describes the basic interface for reading from the minibuffer with completion.

Function: completing-read prompt collection &optional predicate require-match initial history default inherit-input-method

This function reads a string in the minibuffer, assisting the user by providing completion. It activates the minibuffer with prompt prompt, which must be a string.

The actual completion is done by passing the completion table collection and the completion predicate predicate to the function try-completion (see section Basic Completion Functions). This happens in certain commands bound in the local keymaps used for completion. Some of these commands also call test-completion. Thus, if predicate is non-nil, it should be compatible with collection and completion-ignore-case. See Definition of test-completion.

The value of the optional argument require-match determines how the user may exit the minibuffer:

However, empty input is always permitted, regardless of the value of require-match; in that case, completing-read returns the first element of default, if it is a list; "", if default is nil; or default. The string or strings in default are also available to the user through the history commands.

The function completing-read uses minibuffer-local-completion-map as the keymap if require-match is nil, and uses minibuffer-local-must-match-map if require-match is non-nil. See section Minibuffer Commands that Do Completion.

The argument history specifies which history list variable to use for saving the input and for minibuffer history commands. It defaults to minibuffer-history. See section Minibuffer History.

The argument initial is mostly deprecated; we recommend using a non-nil value only in conjunction with specifying a cons cell for history. See section Initial Input. For default input, use default instead.

If the argument inherit-input-method is non-nil, then the minibuffer inherits the current input method (see section Input Methods) and the setting of enable-multibyte-characters (see section Text Representations) from whichever buffer was current before entering the minibuffer.

If the variable completion-ignore-case is non-nil, completion ignores case when comparing the input against the possible matches. See section Basic Completion Functions. In this mode of operation, predicate must also ignore case, or you will get surprising results.

Here’s an example of using completing-read:

(completing-read
 "Complete a foo: "
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 nil t "fo")
;; After evaluation of the preceding expression,
;;   the following appears in the minibuffer:

---------- Buffer: Minibuffer ----------
Complete a foo: fo∗
---------- Buffer: Minibuffer ----------

If the user then types DEL DEL b RET, completing-read returns barfoo.

The completing-read function binds variables to pass information to the commands that actually do completion. They are described in the following section.

Variable: completing-read-function

The value of this variable must be a function, which is called by completing-read to actually do its work. It should accept the same arguments as completing-read. This can be bound to a different function to completely override the normal behavior of completing-read.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.3 Minibuffer Commands that Do Completion

This section describes the keymaps, commands and user options used in the minibuffer to do completion.

Variable: minibuffer-completion-table

The value of this variable is the completion table used for completion in the minibuffer. This is the global variable that contains what completing-read passes to try-completion. It is used by minibuffer completion commands such as minibuffer-complete-word.

Variable: minibuffer-completion-predicate

This variable’s value is the predicate that completing-read passes to try-completion. The variable is also used by the other minibuffer completion functions.

Variable: minibuffer-completion-confirm

This variable determines whether Emacs asks for confirmation before exiting the minibuffer; completing-read binds this variable, and the function minibuffer-complete-and-exit checks the value before exiting. If the value is nil, confirmation is not required. If the value is confirm, the user may exit with an input that is not a valid completion alternative, but Emacs asks for confirmation. If the value is confirm-after-completion, the user may exit with an input that is not a valid completion alternative, but Emacs asks for confirmation if the user submitted the input right after any of the completion commands in minibuffer-confirm-exit-commands.

Variable: minibuffer-confirm-exit-commands

This variable holds a list of commands that cause Emacs to ask for confirmation before exiting the minibuffer, if the require-match argument to completing-read is confirm-after-completion. The confirmation is requested if the user attempts to exit the minibuffer immediately after calling any command in this list.

Command: minibuffer-complete-word

This function completes the minibuffer contents by at most a single word. Even if the minibuffer contents have only one completion, minibuffer-complete-word does not add any characters beyond the first character that is not a word constituent. See section Syntax Tables.

Command: minibuffer-complete

This function completes the minibuffer contents as far as possible.

Command: minibuffer-complete-and-exit

This function completes the minibuffer contents, and exits if confirmation is not required, i.e., if minibuffer-completion-confirm is nil. If confirmation is required, it is given by repeating this command immediately—the command is programmed to work without confirmation when run twice in succession.

Command: minibuffer-completion-help

This function creates a list of the possible completions of the current minibuffer contents. It works by calling all-completions using the value of the variable minibuffer-completion-table as the collection argument, and the value of minibuffer-completion-predicate as the predicate argument. The list of completions is displayed as text in a buffer named *Completions*.

Function: display-completion-list completions

This function displays completions to the stream in standard-output, usually a buffer. (See section Reading and Printing Lisp Objects, for more information about streams.) The argument completions is normally a list of completions just returned by all-completions, but it does not have to be. Each element may be a symbol or a string, either of which is simply printed. It can also be a list of two strings, which is printed as if the strings were concatenated. The first of the two strings is the actual completion, the second string serves as annotation.

This function is called by minibuffer-completion-help. A common way to use it is together with with-output-to-temp-buffer, like this:

(with-output-to-temp-buffer "*Completions*"
  (display-completion-list
    (all-completions (buffer-string) my-alist)))
User Option: completion-auto-help

If this variable is non-nil, the completion commands automatically display a list of possible completions whenever nothing can be completed because the next character is not uniquely determined.

Variable: minibuffer-local-completion-map

completing-read uses this value as the local keymap when an exact match of one of the completions is not required. By default, this keymap makes the following bindings:

?

minibuffer-completion-help

SPC

minibuffer-complete-word

TAB

minibuffer-complete

and uses minibuffer-local-map as its parent keymap (see Definition of minibuffer-local-map).

Variable: minibuffer-local-must-match-map

completing-read uses this value as the local keymap when an exact match of one of the completions is required. Therefore, no keys are bound to exit-minibuffer, the command that exits the minibuffer unconditionally. By default, this keymap makes the following bindings:

C-j

minibuffer-complete-and-exit

RET

minibuffer-complete-and-exit

and uses minibuffer-local-completion-map as its parent keymap.

Variable: minibuffer-local-filename-completion-map

This is a sparse keymap that simply unbinds SPC; because filenames can contain spaces. The function read-file-name combines this keymap with either minibuffer-local-completion-map or minibuffer-local-must-match-map.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.4 High-Level Completion Functions

This section describes the higher-level convenience functions for reading certain sorts of names with completion.

In most cases, you should not call these functions in the middle of a Lisp function. When possible, do all minibuffer input as part of reading the arguments for a command, in the interactive specification. See section Defining Commands.

Function: read-buffer prompt &optional default require-match

This function reads the name of a buffer and returns it as a string. The argument default is the default name to use, the value to return if the user exits with an empty minibuffer. If non-nil, it should be a string, a list of strings, or a buffer. If it is a list, the default value is the first element of this list. It is mentioned in the prompt, but is not inserted in the minibuffer as initial input.

The argument prompt should be a string ending with a colon and a space. If default is non-nil, the function inserts it in prompt before the colon to follow the convention for reading from the minibuffer with a default value (see section Emacs Programming Tips).

The optional argument require-match has the same meaning as in completing-read. See section Completion and the Minibuffer.

In the following example, the user enters ‘minibuffer.t’, and then types RET. The argument require-match is t, and the only buffer name starting with the given input is ‘minibuffer.texi’, so that name is the value.

(read-buffer "Buffer name: " "foo" t)
;; After evaluation of the preceding expression,
;;   the following prompt appears,
;;   with an empty minibuffer:
---------- Buffer: Minibuffer ----------
Buffer name (default foo): ∗
---------- Buffer: Minibuffer ----------
;; The user types minibuffer.t RET.
     ⇒ "minibuffer.texi"
User Option: read-buffer-function

This variable, if non-nil, specifies a function for reading buffer names. read-buffer calls this function instead of doing its usual work, with the same arguments passed to read-buffer.

User Option: read-buffer-completion-ignore-case

If this variable is non-nil, read-buffer ignores case when performing completion.

Function: read-command prompt &optional default

This function reads the name of a command and returns it as a Lisp symbol. The argument prompt is used as in read-from-minibuffer. Recall that a command is anything for which commandp returns t, and a command name is a symbol for which commandp returns t. See section Interactive Call.

The argument default specifies what to return if the user enters null input. It can be a symbol, a string or a list of strings. If it is a string, read-command interns it before returning it. If it is a list, read-command interns the first element of this list. If default is nil, that means no default has been specified; then if the user enters null input, the return value is (intern ""), that is, a symbol whose name is an empty string.

(read-command "Command name? ")

;; After evaluation of the preceding expression,
;;   the following prompt appears with an empty minibuffer:
---------- Buffer: Minibuffer ----------
Command name?
---------- Buffer: Minibuffer ----------

If the user types forward-c RET, then this function returns forward-char.

The read-command function is a simplified interface to completing-read. It uses the variable obarray so as to complete in the set of extant Lisp symbols, and it uses the commandp predicate so as to accept only command names:

(read-command prompt)
≡
(intern (completing-read prompt obarray
                         'commandp t nil))
Function: read-variable prompt &optional default

This function reads the name of a customizable variable and returns it as a symbol. Its arguments have the same form as those of read-command. It behaves just like read-command, except that it uses the predicate custom-variable-p instead of commandp.

Command: read-color &optional prompt convert allow-empty display

This function reads a string that is a color specification, either the color’s name or an RGB hex value such as #RRRGGGBBB. It prompts with prompt (default: "Color (name or #RGB triplet):") and provides completion for color names, but not for hex RGB values. In addition to names of standard colors, completion candidates include the foreground and background colors at point.

Valid RGB values are described in Color Names.

The function’s return value is the string typed by the user in the minibuffer. However, when called interactively or if the optional argument convert is non-nil, it converts any input color name into the corresponding RGB value string and instead returns that. This function requires a valid color specification to be input. Empty color names are allowed when allow-empty is non-nil and the user enters null input.

Interactively, or when display is non-nil, the return value is also displayed in the echo area.

See also the functions read-coding-system and read-non-nil-coding-system, in User-Chosen Coding Systems, and read-input-method-name, in Input Methods.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.5 Reading File Names

The high-level completion functions read-file-name, read-directory-name, and read-shell-command are designed to read file names, directory names, and shell commands, respectively. They provide special features, including automatic insertion of the default directory.

Function: read-file-name prompt &optional directory default require-match initial predicate

This function reads a file name, prompting with prompt and providing completion.

As an exception, this function reads a file name using a graphical file dialog instead of the minibuffer, if all of the following are true:

  1. It is invoked via a mouse command.
  2. The selected frame is on a graphical display supporting such dialogs.
  3. The variable use-dialog-box is non-nil. See Dialog Boxes in The GNU Emacs Manual.
  4. The directory argument, described below, does not specify a remote file. See Remote Files in The GNU Emacs Manual.

The exact behavior when using a graphical file dialog is platform-dependent. Here, we simply document the behavior when using the minibuffer.

read-file-name does not automatically expand the returned file name. You must call expand-file-name yourself if an absolute file name is required.

The optional argument require-match has the same meaning as in completing-read. See section Completion and the Minibuffer.

The argument directory specifies the directory to use for completing relative file names. It should be an absolute directory name. If the variable insert-default-directory is non-nil, directory is also inserted in the minibuffer as initial input. It defaults to the current buffer’s value of default-directory.

If you specify initial, that is an initial file name to insert in the buffer (after directory, if that is inserted). In this case, point goes at the beginning of initial. The default for initial is nil—don’t insert any file name. To see what initial does, try the command C-x C-v in a buffer visiting a file. Please note: we recommend using default rather than initial in most cases.

If default is non-nil, then the function returns default if the user exits the minibuffer with the same non-empty contents that read-file-name inserted initially. The initial minibuffer contents are always non-empty if insert-default-directory is non-nil, as it is by default. default is not checked for validity, regardless of the value of require-match. However, if require-match is non-nil, the initial minibuffer contents should be a valid file (or directory) name. Otherwise read-file-name attempts completion if the user exits without any editing, and does not return default. default is also available through the history commands.

If default is nil, read-file-name tries to find a substitute default to use in its place, which it treats in exactly the same way as if it had been specified explicitly. If default is nil, but initial is non-nil, then the default is the absolute file name obtained from directory and initial. If both default and initial are nil and the buffer is visiting a file, read-file-name uses the absolute file name of that file as default. If the buffer is not visiting a file, then there is no default. In that case, if the user types RET without any editing, read-file-name simply returns the pre-inserted contents of the minibuffer.

If the user types RET in an empty minibuffer, this function returns an empty string, regardless of the value of require-match. This is, for instance, how the user can make the current buffer visit no file using M-x set-visited-file-name.

If predicate is non-nil, it specifies a function of one argument that decides which file names are acceptable completion alternatives. A file name is an acceptable value if predicate returns non-nil for it.

Here is an example of using read-file-name:

(read-file-name "The file is ")

;; After evaluation of the preceding expression,
;;   the following appears in the minibuffer:
---------- Buffer: Minibuffer ----------
The file is /gp/gnu/elisp/∗
---------- Buffer: Minibuffer ----------

Typing manual TAB results in the following:

---------- Buffer: Minibuffer ----------
The file is /gp/gnu/elisp/manual.texi∗
---------- Buffer: Minibuffer ----------

If the user types RET, read-file-name returns the file name as the string "/gp/gnu/elisp/manual.texi".

Variable: read-file-name-function

If non-nil, this should be a function that accepts the same arguments as read-file-name. When read-file-name is called, it calls this function with the supplied arguments instead of doing its usual work.

User Option: read-file-name-completion-ignore-case

If this variable is non-nil, read-file-name ignores case when performing completion.

Function: read-directory-name prompt &optional directory default require-match initial

This function is like read-file-name but allows only directory names as completion alternatives.

If default is nil and initial is non-nil, read-directory-name constructs a substitute default by combining directory (or the current buffer’s default directory if directory is nil) and initial. If both default and initial are nil, this function uses directory as substitute default, or the current buffer’s default directory if directory is nil.

User Option: insert-default-directory

This variable is used by read-file-name, and thus, indirectly, by most commands reading file names. (This includes all commands that use the code letters ‘f’ or ‘F’ in their interactive form. See section Code Characters for interactive.) Its value controls whether read-file-name starts by placing the name of the default directory in the minibuffer, plus the initial file name, if any. If the value of this variable is nil, then read-file-name does not place any initial input in the minibuffer (unless you specify initial input with the initial argument). In that case, the default directory is still used for completion of relative file names, but is not displayed.

If this variable is nil and the initial minibuffer contents are empty, the user may have to explicitly fetch the next history element to access a default value. If the variable is non-nil, the initial minibuffer contents are always non-empty and the user can always request a default value by immediately typing RET in an unedited minibuffer. (See above.)

For example:

;; Here the minibuffer starts out with the default directory.
(let ((insert-default-directory t))
  (read-file-name "The file is "))
---------- Buffer: Minibuffer ----------
The file is ~lewis/manual/∗
---------- Buffer: Minibuffer ----------
;; Here the minibuffer is empty and only the prompt
;;   appears on its line.
(let ((insert-default-directory nil))
  (read-file-name "The file is "))
---------- Buffer: Minibuffer ----------
The file is ∗
---------- Buffer: Minibuffer ----------
Function: read-shell-command prompt &optional initial history &rest args

This function reads a shell command from the minibuffer, prompting with prompt and providing intelligent completion. It completes the first word of the command using candidates that are appropriate for command names, and the rest of the command words as file names.

This function uses minibuffer-local-shell-command-map as the keymap for minibuffer input. The history argument specifies the history list to use; if is omitted or nil, it defaults to shell-command-history (see section shell-command-history). The optional argument initial specifies the initial content of the minibuffer (see section Initial Input). The rest of args, if present, are used as the default and inherit-input-method arguments in read-from-minibuffer (see section Reading Text Strings with the Minibuffer).

Variable: minibuffer-local-shell-command-map

This keymap is used by read-shell-command for completing command and file names that are part of a shell command. It uses minibuffer-local-map as its parent keymap, and binds TAB to completion-at-point.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.6 Completion Variables

Here are some variables that can be used to alter the default completion behavior.

User Option: completion-styles

The value of this variable is a list of completion style (symbols) to use for performing completion. A completion style is a set of rules for generating completions. Each symbol occurring this list must have a corresponding entry in completion-styles-alist.

Variable: completion-styles-alist

This variable stores a list of available completion styles. Each element in the list has the form

(style try-completion all-completions doc)

Here, style is the name of the completion style (a symbol), which may be used in the completion-styles variable to refer to this style; try-completion is the function that does the completion; all-completions is the function that lists the completions; and doc is a string describing the completion style.

The try-completion and all-completions functions should each accept four arguments: string, collection, predicate, and point. The string, collection, and predicate arguments have the same meanings as in try-completion (see section Basic Completion Functions), and the point argument is the position of point within string. Each function should return a non-nil value if it performed its job, and nil if it did not (e.g., if there is no way to complete string according to the completion style).

When the user calls a completion command like minibuffer-complete (see section Minibuffer Commands that Do Completion), Emacs looks for the first style listed in completion-styles and calls its try-completion function. If this function returns nil, Emacs moves to the next listed completion style and calls its try-completion function, and so on until one of the try-completion functions successfully performs completion and returns a non-nil value. A similar procedure is used for listing completions, via the all-completions functions.

See Completion Styles in The GNU Emacs Manual, for a description of the available completion styles.

User Option: completion-category-overrides

This variable specifies special completion styles and other completion behaviors to use when completing certain types of text. Its value should be an alist with elements of the form (category . alist). category is a symbol describing what is being completed; currently, the buffer, file, and unicode-name categories are defined, but others can be defined via specialized completion functions (see section Programmed Completion). alist is an association list describing how completion should behave for the corresponding category. The following alist keys are supported:

styles

The value should be a list of completion styles (symbols).

cycle

The value should be a value for completion-cycle-threshold (see Completion Options in The GNU Emacs Manual) for this category.

Additional alist entries may be defined in the future.

Variable: completion-extra-properties

This variable is used to specify extra properties of the current completion command. It is intended to be let-bound by specialized completion commands. Its value should be a list of property and value pairs. The following properties are supported:

:annotation-function

The value should be a function to add annotations in the completions buffer. This function must accept one argument, a completion, and should either return nil or a string to be displayed next to the completion.

:exit-function

The value should be a function to run after performing completion. The function should accept two arguments, string and status, where string is the text to which the field was completed, and status indicates what kind of operation happened: finished if text is now complete, sole if the text cannot be further completed but completion is not finished, or exact if the text is a valid completion but may be further completed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.7 Programmed Completion

Sometimes it is not possible or convenient to create an alist or an obarray containing all the intended possible completions ahead of time. In such a case, you can supply your own function to compute the completion of a given string. This is called programmed completion. Emacs uses programmed completion when completing file names (see section File Name Completion), among many other cases.

To use this feature, pass a function as the collection argument to completing-read. The function completing-read arranges to pass your completion function along to try-completion, all-completions, and other basic completion functions, which will then let your function do all the work.

The completion function should accept three arguments:

The following is a list of metadata entries that a completion function may return in response to a metadata flag argument:

category

The value should be a symbol describing what kind of text the completion function is trying to complete. If the symbol matches one of the keys in completion-category-overrides, the usual completion behavior is overridden. See section Completion Variables.

annotation-function

The value should be a function for annotating completions. The function should take one argument, string, which is a possible completion. It should return a string, which is displayed after the completion string in the *Completions* buffer.

display-sort-function

The value should be a function for sorting completions. The function should take one argument, a list of completion strings, and return a sorted list of completion strings. It is allowed to alter the input list destructively.

cycle-sort-function

The value should be a function for sorting completions, when completion-cycle-threshold is non-nil and the user is cycling through completion alternatives. See Completion Options in The GNU Emacs Manual. Its argument list and return value are the same as for display-sort-function.

Function: completion-table-dynamic function

This function is a convenient way to write a function that can act as a programmed completion function. The argument function should be a function that takes one argument, a string, and returns an alist of possible completions of it. You can think of completion-table-dynamic as a transducer between that interface and the interface for programmed completion functions.

Function: completion-table-with-cache function &optional ignore-case

This is a wrapper for completion-table-dynamic that saves the last argument-result pair. This means that multiple lookups with the same argument only need to call function once. This can be useful when a slow operation is involved, such as calling an external process.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.8 Completion in Ordinary Buffers

Although completion is usually done in the minibuffer, the completion facility can also be used on the text in ordinary Emacs buffers. In many major modes, in-buffer completion is performed by the C-M-i or M-TAB command, bound to completion-at-point. See Symbol Completion in The GNU Emacs Manual. This command uses the abnormal hook variable completion-at-point-functions:

Variable: completion-at-point-functions

The value of this abnormal hook should be a list of functions, which are used to compute a completion table for completing the text at point. It can be used by major modes to provide mode-specific completion tables (see section Major Mode Conventions).

When the command completion-at-point runs, it calls the functions in the list one by one, without any argument. Each function should return nil if it is unable to produce a completion table for the text at point. Otherwise it should return a list of the form

(start end collection . props)

start and end delimit the text to complete (which should enclose point). collection is a completion table for completing that text, in a form suitable for passing as the second argument to try-completion (see section Basic Completion Functions); completion alternatives will be generated from this completion table in the usual way, via the completion styles defined in completion-styles (see section Completion Variables). props is a property list for additional information; any of the properties in completion-extra-properties are recognized (see section Completion Variables), as well as the following additional ones:

:predicate

The value should be a predicate that completion candidates need to satisfy.

:exclusive

If the value is no, then if the completion table fails to match the text at point, completion-at-point moves on to the next function in completion-at-point-functions instead of reporting a completion failure.

A function in completion-at-point-functions may also return a function. In that case, that returned function is called, with no argument, and it is entirely responsible for performing the completion. We discourage this usage; it is intended to help convert old code to using completion-at-point.

The first function in completion-at-point-functions to return a non-nil value is used by completion-at-point. The remaining functions are not called. The exception to this is when there is an :exclusive specification, as described above.

The following function provides a convenient way to perform completion on an arbitrary stretch of text in an Emacs buffer:

Function: completion-in-region start end collection &optional predicate

This function completes the text in the current buffer between the positions start and end, using collection. The argument collection has the same meaning as in try-completion (see section Basic Completion Functions).

This function inserts the completion text directly into the current buffer. Unlike completing-read (see section Completion and the Minibuffer), it does not activate the minibuffer.

For this function to work, point must be somewhere between start and end.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.7 Yes-or-No Queries

This section describes functions used to ask the user a yes-or-no question. The function y-or-n-p can be answered with a single character; it is useful for questions where an inadvertent wrong answer will not have serious consequences. yes-or-no-p is suitable for more momentous questions, since it requires three or four characters to answer.

If either of these functions is called in a command that was invoked using the mouse—more precisely, if last-nonmenu-event (see section Information from the Command Loop) is either nil or a list—then it uses a dialog box or pop-up menu to ask the question. Otherwise, it uses keyboard input. You can force use either of the mouse or of keyboard input by binding last-nonmenu-event to a suitable value around the call.

Strictly speaking, yes-or-no-p uses the minibuffer and y-or-n-p does not; but it seems best to describe them together.

Function: y-or-n-p prompt

This function asks the user a question, expecting input in the echo area. It returns t if the user types y, nil if the user types n. This function also accepts SPC to mean yes and DEL to mean no. It accepts C-] to mean “quit”, like C-g, because the question might look like a minibuffer and for that reason the user might try to use C-] to get out. The answer is a single character, with no RET needed to terminate it. Upper and lower case are equivalent.

“Asking the question” means printing prompt in the echo area, followed by the string ‘(y or n) . If the input is not one of the expected answers (y, n, SPC, DEL, or something that quits), the function responds ‘Please answer y or n.’, and repeats the request.

This function does not actually use the minibuffer, since it does not allow editing of the answer. It actually uses the echo area (see section The Echo Area), which uses the same screen space as the minibuffer. The cursor moves to the echo area while the question is being asked.

The answers and their meanings, even ‘y’ and ‘n’, are not hardwired, and are specified by the keymap query-replace-map (see section Search and Replace). In particular, if the user enters the special responses recenter, scroll-up, scroll-down, scroll-other-window, or scroll-other-window-down (respectively bound to C-l, C-v, M-v, C-M-v and C-M-S-v in query-replace-map), this function performs the specified window recentering or scrolling operation, and poses the question again.

We show successive lines of echo area messages, but only one actually appears on the screen at a time.

Function: y-or-n-p-with-timeout prompt seconds default

Like y-or-n-p, except that if the user fails to answer within seconds seconds, this function stops waiting and returns default. It works by setting up a timer; see Timers for Delayed Execution. The argument seconds should be a number.

Function: yes-or-no-p prompt

This function asks the user a question, expecting input in the minibuffer. It returns t if the user enters ‘yes’, nil if the user types ‘no’. The user must type RET to finalize the response. Upper and lower case are equivalent.

yes-or-no-p starts by displaying prompt in the echo area, followed by ‘(yes or no) . The user must type one of the expected responses; otherwise, the function responds ‘Please answer yes or no.’, waits about two seconds and repeats the request.

yes-or-no-p requires more work from the user than y-or-n-p and is appropriate for more crucial decisions.

Here is an example:

(yes-or-no-p "Do you really want to remove everything? ")

;; After evaluation of the preceding expression,
;;   the following prompt appears,
;;   with an empty minibuffer:
---------- Buffer: minibuffer ----------
Do you really want to remove everything? (yes or no)
---------- Buffer: minibuffer ----------

If the user first types y RET, which is invalid because this function demands the entire word ‘yes’, it responds by displaying these prompts, with a brief pause between them:

---------- Buffer: minibuffer ----------
Please answer yes or no.
Do you really want to remove everything? (yes or no)
---------- Buffer: minibuffer ----------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.8 Asking Multiple Y-or-N Questions

When you have a series of similar questions to ask, such as “Do you want to save this buffer” for each buffer in turn, you should use map-y-or-n-p to ask the collection of questions, rather than asking each question individually. This gives the user certain convenient facilities such as the ability to answer the whole series at once.

Function: map-y-or-n-p prompter actor list &optional help action-alist no-cursor-in-echo-area

This function asks the user a series of questions, reading a single-character answer in the echo area for each one.

The value of list specifies the objects to ask questions about. It should be either a list of objects or a generator function. If it is a function, it should expect no arguments, and should return either the next object to ask about, or nil, meaning to stop asking questions.

The argument prompter specifies how to ask each question. If prompter is a string, the question text is computed like this:

(format prompter object)

where object is the next object to ask about (as obtained from list).

If not a string, prompter should be a function of one argument (the next object to ask about) and should return the question text. If the value is a string, that is the question to ask the user. The function can also return t, meaning do act on this object (and don’t ask the user), or nil, meaning ignore this object (and don’t ask the user).

The argument actor says how to act on the answers that the user gives. It should be a function of one argument, and it is called with each object that the user says yes for. Its argument is always an object obtained from list.

If the argument help is given, it should be a list of this form:

(singular plural action)

where singular is a string containing a singular noun that describes the objects conceptually being acted on, plural is the corresponding plural noun, and action is a transitive verb describing what actor does.

If you don’t specify help, the default is ("object" "objects" "act on").

Each time a question is asked, the user may enter y, Y, or SPC to act on that object; n, N, or DEL to skip that object; ! to act on all following objects; ESC or q to exit (skip all following objects); . (period) to act on the current object and then exit; or C-h to get help. These are the same answers that query-replace accepts. The keymap query-replace-map defines their meaning for map-y-or-n-p as well as for query-replace; see Search and Replace.

You can use action-alist to specify additional possible answers and what they mean. It is an alist of elements of the form (char function help), each of which defines one additional answer. In this element, char is a character (the answer); function is a function of one argument (an object from list); help is a string.

When the user responds with char, map-y-or-n-p calls function. If it returns non-nil, the object is considered “acted upon”, and map-y-or-n-p advances to the next object in list. If it returns nil, the prompt is repeated for the same object.

Normally, map-y-or-n-p binds cursor-in-echo-area while prompting. But if no-cursor-in-echo-area is non-nil, it does not do that.

If map-y-or-n-p is called in a command that was invoked using the mouse—more precisely, if last-nonmenu-event (see section Information from the Command Loop) is either nil or a list—then it uses a dialog box or pop-up menu to ask the question. In this case, it does not use keyboard input or the echo area. You can force use either of the mouse or of keyboard input by binding last-nonmenu-event to a suitable value around the call.

The return value of map-y-or-n-p is the number of objects acted on.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.9 Reading a Password

To read a password to pass to another program, you can use the function read-passwd.

Function: read-passwd prompt &optional confirm default

This function reads a password, prompting with prompt. It does not echo the password as the user types it; instead, it echoes ‘.’ for each character in the password. (Note that in batch mode, the input is not hidden.)

The optional argument confirm, if non-nil, says to read the password twice and insist it must be the same both times. If it isn’t the same, the user has to type it over and over until the last two times match.

The optional argument default specifies the default password to return if the user enters empty input. If default is nil, then read-passwd returns the null string in that case.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.10 Minibuffer Commands

This section describes some commands meant for use in the minibuffer.

Command: exit-minibuffer

This command exits the active minibuffer. It is normally bound to keys in minibuffer local keymaps.

Command: self-insert-and-exit

This command exits the active minibuffer after inserting the last character typed on the keyboard (found in last-command-event; see section Information from the Command Loop).

Command: previous-history-element n

This command replaces the minibuffer contents with the value of the nth previous (older) history element.

Command: next-history-element n

This command replaces the minibuffer contents with the value of the nth more recent history element.

Command: previous-matching-history-element pattern n

This command replaces the minibuffer contents with the value of the nth previous (older) history element that matches pattern (a regular expression).

Command: next-matching-history-element pattern n

This command replaces the minibuffer contents with the value of the nth next (newer) history element that matches pattern (a regular expression).

Command: previous-complete-history-element n

This command replaces the minibuffer contents with the value of the nth previous (older) history element that completes the current contents of the minibuffer before the point.

Command: next-complete-history-element n

This command replaces the minibuffer contents with the value of the nth next (newer) history element that completes the current contents of the minibuffer before the point.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.11 Minibuffer Windows

These functions access and select minibuffer windows and test whether they are active.

Function: active-minibuffer-window

This function returns the currently active minibuffer window, or nil if there is none.

Function: minibuffer-window &optional frame

This function returns the minibuffer window used for frame frame. If frame is nil, that stands for the current frame. Note that the minibuffer window used by a frame need not be part of that frame—a frame that has no minibuffer of its own necessarily uses some other frame’s minibuffer window.

Function: set-minibuffer-window window

This function specifies window as the minibuffer window to use. This affects where the minibuffer is displayed if you put text in it without invoking the usual minibuffer commands. It has no effect on the usual minibuffer input functions because they all start by choosing the minibuffer window according to the current frame.

Function: window-minibuffer-p &optional window

This function returns non-nil if window is a minibuffer window. window defaults to the selected window.

It is not correct to determine whether a given window is a minibuffer by comparing it with the result of (minibuffer-window), because there can be more than one minibuffer window if there is more than one frame.

Function: minibuffer-window-active-p window

This function returns non-nil if window is the currently active minibuffer window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.12 Minibuffer Contents

These functions access the minibuffer prompt and contents.

Function: minibuffer-prompt

This function returns the prompt string of the currently active minibuffer. If no minibuffer is active, it returns nil.

Function: minibuffer-prompt-end

This function returns the current position of the end of the minibuffer prompt, if a minibuffer is current. Otherwise, it returns the minimum valid buffer position.

Function: minibuffer-prompt-width

This function returns the current display-width of the minibuffer prompt, if a minibuffer is current. Otherwise, it returns zero.

Function: minibuffer-contents

This function returns the editable contents of the minibuffer (that is, everything except the prompt) as a string, if a minibuffer is current. Otherwise, it returns the entire contents of the current buffer.

Function: minibuffer-contents-no-properties

This is like minibuffer-contents, except that it does not copy text properties, just the characters themselves. See section Text Properties.

Function: delete-minibuffer-contents

This function erases the editable contents of the minibuffer (that is, everything except the prompt), if a minibuffer is current. Otherwise, it erases the entire current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.13 Recursive Minibuffers

These functions and variables deal with recursive minibuffers (see section Recursive Editing):

Function: minibuffer-depth

This function returns the current depth of activations of the minibuffer, a nonnegative integer. If no minibuffers are active, it returns zero.

User Option: enable-recursive-minibuffers

If this variable is non-nil, you can invoke commands (such as find-file) that use minibuffers even while the minibuffer window is active. Such invocation produces a recursive editing level for a new minibuffer. The outer-level minibuffer is invisible while you are editing the inner one.

If this variable is nil, you cannot invoke minibuffer commands when the minibuffer window is active, not even if you switch to another window to do it.

If a command name has a property enable-recursive-minibuffers that is non-nil, then the command can use the minibuffer to read arguments even if it is invoked from the minibuffer. A command can also achieve this by binding enable-recursive-minibuffers to t in the interactive declaration (see section Using interactive). The minibuffer command next-matching-history-element (normally M-s in the minibuffer) does the latter.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.14 Minibuffer Miscellany

Function: minibufferp &optional buffer-or-name

This function returns non-nil if buffer-or-name is a minibuffer. If buffer-or-name is omitted, it tests the current buffer.

Variable: minibuffer-setup-hook

This is a normal hook that is run whenever the minibuffer is entered. See section Hooks.

Variable: minibuffer-exit-hook

This is a normal hook that is run whenever the minibuffer is exited. See section Hooks.

Variable: minibuffer-help-form

The current value of this variable is used to rebind help-form locally inside the minibuffer (see section Help Functions).

Variable: minibuffer-scroll-window

If the value of this variable is non-nil, it should be a window object. When the function scroll-other-window is called in the minibuffer, it scrolls this window.

Function: minibuffer-selected-window

This function returns the window that was selected when the minibuffer was entered. If selected window is not a minibuffer window, it returns nil.

User Option: max-mini-window-height

This variable specifies the maximum height for resizing minibuffer windows. If a float, it specifies a fraction of the height of the frame. If an integer, it specifies a number of lines.

Function: minibuffer-message string &rest args

This function displays string temporarily at the end of the minibuffer text, for a few seconds, or until the next input event arrives, whichever comes first. The variable minibuffer-message-timeout specifies the number of seconds to wait in the absence of input. It defaults to 2. If args is non-nil, the actual message is obtained by passing string and args through format. See section Formatting Strings.

Command: minibuffer-inactive-mode

This is the major mode used in inactive minibuffers. It uses keymap minibuffer-inactive-mode-map. This can be useful if the minibuffer is in a separate frame. See section Minibuffers and Frames.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20 Command Loop

When you run Emacs, it enters the editor command loop almost immediately. This loop reads key sequences, executes their definitions, and displays the results. In this chapter, we describe how these things are done, and the subroutines that allow Lisp programs to do them.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.1 Command Loop Overview

The first thing the command loop must do is read a key sequence, which is a sequence of input events that translates into a command. It does this by calling the function read-key-sequence. Lisp programs can also call this function (see section Key Sequence Input). They can also read input at a lower level with read-key or read-event (see section Reading One Event), or discard pending input with discard-input (see section Miscellaneous Event Input Features).

The key sequence is translated into a command through the currently active keymaps. See section Key Lookup, for information on how this is done. The result should be a keyboard macro or an interactively callable function. If the key is M-x, then it reads the name of another command, which it then calls. This is done by the command execute-extended-command (see section Interactive Call).

Prior to executing the command, Emacs runs undo-boundary to create an undo boundary. See section Maintaining Undo Lists.

To execute a command, Emacs first reads its arguments by calling command-execute (see section Interactive Call). For commands written in Lisp, the interactive specification says how to read the arguments. This may use the prefix argument (see section Prefix Command Arguments) or may read with prompting in the minibuffer (see section Minibuffers). For example, the command find-file has an interactive specification which says to read a file name using the minibuffer. The function body of find-file does not use the minibuffer, so if you call find-file as a function from Lisp code, you must supply the file name string as an ordinary Lisp function argument.

If the command is a keyboard macro (i.e., a string or vector), Emacs executes it using execute-kbd-macro (see section Keyboard Macros).

Variable: pre-command-hook

This normal hook is run by the editor command loop before it executes each command. At that time, this-command contains the command that is about to run, and last-command describes the previous command. See section Information from the Command Loop.

Variable: post-command-hook

This normal hook is run by the editor command loop after it executes each command (including commands terminated prematurely by quitting or by errors). At that time, this-command refers to the command that just ran, and last-command refers to the command before that.

This hook is also run when Emacs first enters the command loop (at which point this-command and last-command are both nil).

Quitting is suppressed while running pre-command-hook and post-command-hook. If an error happens while executing one of these hooks, it does not terminate execution of the hook; instead the error is silenced and the function in which the error occurred is removed from the hook.

A request coming into the Emacs server (see Emacs Server in The GNU Emacs Manual) runs these two hooks just as a keyboard command does.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2 Defining Commands

The special form interactive turns a Lisp function into a command. The interactive form must be located at top-level in the function body, usually as the first form in the body; this applies to both lambda expressions (see section Lambda Expressions) and defun forms (see section Defining Functions). This form does nothing during the actual execution of the function; its presence serves as a flag, telling the Emacs command loop that the function can be called interactively. The argument of the interactive form specifies how the arguments for an interactive call should be read.

Alternatively, an interactive form may be specified in a function symbol’s interactive-form property. A non-nil value for this property takes precedence over any interactive form in the function body itself. This feature is seldom used.

Sometimes, a function is only intended to be called interactively, never directly from Lisp. In that case, give the function a non-nil interactive-only property. This causes the byte compiler to warn if the command is called from Lisp. The value of the property can be: a string, which the byte-compiler will use directly in its warning (it should end with a period, and not start with a capital, e.g. “use … instead.”); t; any other symbol, which should be an alternative function to use in Lisp code.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2.1 Using interactive

This section describes how to write the interactive form that makes a Lisp function an interactively-callable command, and how to examine a command’s interactive form.

Special Form: interactive arg-descriptor

This special form declares that a function is a command, and that it may therefore be called interactively (via M-x or by entering a key sequence bound to it). The argument arg-descriptor declares how to compute the arguments to the command when the command is called interactively.

A command may be called from Lisp programs like any other function, but then the caller supplies the arguments and arg-descriptor has no effect.

The interactive form must be located at top-level in the function body, or in the function symbol’s interactive-form property (see section Symbol Properties). It has its effect because the command loop looks for it before calling the function (see section Interactive Call). Once the function is called, all its body forms are executed; at this time, if the interactive form occurs within the body, the form simply returns nil without even evaluating its argument.

By convention, you should put the interactive form in the function body, as the first top-level form. If there is an interactive form in both the interactive-form symbol property and the function body, the former takes precedence. The interactive-form symbol property can be used to add an interactive form to an existing function, or change how its arguments are processed interactively, without redefining the function.

There are three possibilities for the argument arg-descriptor:

Function: interactive-form function

This function returns the interactive form of function. If function is an interactively callable function (see section Interactive Call), the value is the command’s interactive form (interactive spec), which specifies how to compute its arguments. Otherwise, the value is nil. If function is a symbol, its function definition is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2.2 Code Characters for interactive

The code character descriptions below contain a number of key words, defined here as follows:

Completion

Provide completion. TAB, SPC, and RET perform name completion because the argument is read using completing-read (see section Completion). ? displays a list of possible completions.

Existing

Require the name of an existing object. An invalid name is not accepted; the commands to exit the minibuffer do not exit if the current input is not valid.

Default

A default value of some sort is used if the user enters no text in the minibuffer. The default depends on the code character.

No I/O

This code letter computes an argument without reading any input. Therefore, it does not use a prompt string, and any prompt string you supply is ignored.

Even though the code letter doesn’t use a prompt string, you must follow it with a newline if it is not the last code character in the string.

Prompt

A prompt immediately follows the code character. The prompt ends either with the end of the string or with a newline.

Special

This code character is meaningful only at the beginning of the interactive string, and it does not look for a prompt or a newline. It is a single, isolated character.

Here are the code character descriptions for use with interactive:

*

Signal an error if the current buffer is read-only. Special.

@

Select the window mentioned in the first mouse event in the key sequence that invoked this command. Special.

^

If the command was invoked through shift-translation, set the mark and activate the region temporarily, or extend an already active region, before the command is run. If the command was invoked without shift-translation, and the region is temporarily active, deactivate the region before the command is run. Special.

a

A function name (i.e., a symbol satisfying fboundp). Existing, Completion, Prompt.

b

The name of an existing buffer. By default, uses the name of the current buffer (see section Buffers). Existing, Completion, Default, Prompt.

B

A buffer name. The buffer need not exist. By default, uses the name of a recently used buffer other than the current buffer. Completion, Default, Prompt.

c

A character. The cursor does not move into the echo area. Prompt.

C

A command name (i.e., a symbol satisfying commandp). Existing, Completion, Prompt.

d

The position of point, as an integer (see section Point). No I/O.

D

A directory name. The default is the current default directory of the current buffer, default-directory (see section Functions that Expand Filenames). Existing, Completion, Default, Prompt.

e

The first or next non-keyboard event in the key sequence that invoked the command. More precisely, ‘e’ gets events that are lists, so you can look at the data in the lists. See section Input Events. No I/O.

You use ‘e’ for mouse events and for special system events (see section Miscellaneous System Events). The event list that the command receives depends on the event. See section Input Events, which describes the forms of the list for each event in the corresponding subsections.

You can use ‘e’ more than once in a single command’s interactive specification. If the key sequence that invoked the command has n events that are lists, the nth ‘e’ provides the nth such event. Events that are not lists, such as function keys and ASCII characters, do not count where ‘e’ is concerned.

f

A file name of an existing file (see section File Names). The default directory is default-directory. Existing, Completion, Default, Prompt.

F

A file name. The file need not exist. Completion, Default, Prompt.

G

A file name. The file need not exist. If the user enters just a directory name, then the value is just that directory name, with no file name within the directory added. Completion, Default, Prompt.

i

An irrelevant argument. This code always supplies nil as the argument’s value. No I/O.

k

A key sequence (see section Key Sequences). This keeps reading events until a command (or undefined command) is found in the current key maps. The key sequence argument is represented as a string or vector. The cursor does not move into the echo area. Prompt.

If ‘k’ reads a key sequence that ends with a down-event, it also reads and discards the following up-event. You can get access to that up-event with the ‘U’ code character.

This kind of input is used by commands such as describe-key and global-set-key.

K

A key sequence, whose definition you intend to change. This works like ‘k’, except that it suppresses, for the last input event in the key sequence, the conversions that are normally used (when necessary) to convert an undefined key into a defined one.

m

The position of the mark, as an integer. No I/O.

M

Arbitrary text, read in the minibuffer using the current buffer’s input method, and returned as a string (see Input Methods in The GNU Emacs Manual). Prompt.

n

A number, read with the minibuffer. If the input is not a number, the user has to try again. ‘n’ never uses the prefix argument. Prompt.

N

The numeric prefix argument; but if there is no prefix argument, read a number as with n. The value is always a number. See section Prefix Command Arguments. Prompt.

p

The numeric prefix argument. (Note that this ‘p’ is lower case.) No I/O.

P

The raw prefix argument. (Note that this ‘P’ is upper case.) No I/O.

r

Point and the mark, as two numeric arguments, smallest first. This is the only code letter that specifies two successive arguments rather than one. No I/O.

s

Arbitrary text, read in the minibuffer and returned as a string (see section Reading Text Strings with the Minibuffer). Terminate the input with either C-j or RET. (C-q may be used to include either of these characters in the input.) Prompt.

S

An interned symbol whose name is read in the minibuffer. Terminate the input with either C-j or RET. Other characters that normally terminate a symbol (e.g., whitespace, parentheses and brackets) do not do so here. Prompt.

U

A key sequence or nil. Can be used after a ‘k’ or ‘K’ argument to get the up-event that was discarded (if any) after ‘k’ or ‘K’ read a down-event. If no up-event has been discarded, ‘U’ provides nil as the argument. No I/O.

v

A variable declared to be a user option (i.e., satisfying the predicate custom-variable-p). This reads the variable using read-variable. See Definition of read-variable. Existing, Completion, Prompt.

x

A Lisp object, specified with its read syntax, terminated with a C-j or RET. The object is not evaluated. See section Reading Lisp Objects with the Minibuffer. Prompt.

X

A Lisp form’s value. ‘X’ reads as ‘x’ does, then evaluates the form so that its value becomes the argument for the command. Prompt.

z

A coding system name (a symbol). If the user enters null input, the argument value is nil. See section Coding Systems. Completion, Existing, Prompt.

Z

A coding system name (a symbol)—but only if this command has a prefix argument. With no prefix argument, ‘Z’ provides nil as the argument value. Completion, Existing, Prompt.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2.3 Examples of Using interactive

Here are some examples of interactive:

(defun foo1 ()              ; foo1 takes no arguments,
    (interactive)           ;   just moves forward two words.
    (forward-word 2))
     ⇒ foo1
(defun foo2 (n)             ; foo2 takes one argument,
    (interactive "^p")      ;   which is the numeric prefix.
                            ; under shift-select-mode,
                            ;   will activate or extend region.
    (forward-word (* 2 n)))
     ⇒ foo2
(defun foo3 (n)             ; foo3 takes one argument,
    (interactive "nCount:") ;   which is read with the Minibuffer.
    (forward-word (* 2 n)))
     ⇒ foo3
(defun three-b (b1 b2 b3)
  "Select three existing buffers.
Put them into three windows, selecting the last one."
    (interactive "bBuffer1:\nbBuffer2:\nbBuffer3:")
    (delete-other-windows)
    (split-window (selected-window) 8)
    (switch-to-buffer b1)
    (other-window 1)
    (split-window (selected-window) 8)
    (switch-to-buffer b2)
    (other-window 1)
    (switch-to-buffer b3))
     ⇒ three-b
(three-b "*scratch*" "declarations.texi" "*mail*")
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2.4 Select among Command Alternatives

The macro define-alternatives can be used to define generic commands. These are interactive functions whose implementation can be selected from several alternatives, as a matter of user preference.

Macro: define-alternatives command &rest customizations

Define the new command command, a symbol.

When a user runs M-x command RET for the first time, Emacs prompts for which real form of the command to use, and records the selection by way of a custom variable. Using a prefix argument repeats this process of choosing an alternative.

The variable command-alternatives should contain an alist with alternative implementations of command. Until this variable is set, define-alternatives has no effect.

If customizations is non-nil, it should consist of alternating defcustom keywords (typically :group and :version) and values to add to the declaration of command-alternatives.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.3 Interactive Call

After the command loop has translated a key sequence into a command, it invokes that command using the function command-execute. If the command is a function, command-execute calls call-interactively, which reads the arguments and calls the command. You can also call these functions yourself.

Note that the term “command”, in this context, refers to an interactively callable function (or function-like object), or a keyboard macro. It does not refer to the key sequence used to invoke a command (see section Keymaps).

Function: commandp object &optional for-call-interactively

This function returns t if object is a command. Otherwise, it returns nil.

Commands include strings and vectors (which are treated as keyboard macros), lambda expressions that contain a top-level interactive form (see section Using interactive), byte-code function objects made from such lambda expressions, autoload objects that are declared as interactive (non-nil fourth argument to autoload), and some primitive functions. Also, a symbol is considered a command if it has a non-nil interactive-form property, or if its function definition satisfies commandp.

If for-call-interactively is non-nil, then commandp returns t only for objects that call-interactively could call—thus, not for keyboard macros.

See documentation in Access to Documentation Strings, for a realistic example of using commandp.

Function: call-interactively command &optional record-flag keys

This function calls the interactively callable function command, providing arguments according to its interactive calling specifications. It returns whatever command returns.

If, for instance, you have a function with the following signature:

(defun foo (begin end)
  (interactive "r")
  ...)

then saying

(call-interactively 'foo)

will call foo with the region (point and mark) as the arguments.

An error is signaled if command is not a function or if it cannot be called interactively (i.e., is not a command). Note that keyboard macros (strings and vectors) are not accepted, even though they are considered commands, because they are not functions. If command is a symbol, then call-interactively uses its function definition.

If record-flag is non-nil, then this command and its arguments are unconditionally added to the list command-history. Otherwise, the command is added only if it uses the minibuffer to read an argument. See section Command History.

The argument keys, if given, should be a vector which specifies the sequence of events to supply if the command inquires which events were used to invoke it. If keys is omitted or nil, the default is the return value of this-command-keys-vector. See Definition of this-command-keys-vector.

Function: command-execute command &optional record-flag keys special

This function executes command. The argument command must satisfy the commandp predicate; i.e., it must be an interactively callable function or a keyboard macro.

A string or vector as command is executed with execute-kbd-macro. A function is passed to call-interactively (see above), along with the record-flag and keys arguments.

If command is a symbol, its function definition is used in its place. A symbol with an autoload definition counts as a command if it was declared to stand for an interactively callable function. Such a definition is handled by loading the specified library and then rechecking the definition of the symbol.

The argument special, if given, means to ignore the prefix argument and not clear it. This is used for executing special events (see section Special Events).

Command: execute-extended-command prefix-argument

This function reads a command name from the minibuffer using completing-read (see section Completion). Then it uses command-execute to call the specified command. Whatever that command returns becomes the value of execute-extended-command.

If the command asks for a prefix argument, it receives the value prefix-argument. If execute-extended-command is called interactively, the current raw prefix argument is used for prefix-argument, and thus passed on to whatever command is run.

execute-extended-command is the normal definition of M-x, so it uses the string ‘M-x  as a prompt. (It would be better to take the prompt from the events used to invoke execute-extended-command, but that is painful to implement.) A description of the value of the prefix argument, if any, also becomes part of the prompt.

(execute-extended-command 3)
---------- Buffer: Minibuffer ----------
3 M-x forward-word RET
---------- Buffer: Minibuffer ----------
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.4 Distinguish Interactive Calls

Sometimes a command should display additional visual feedback (such as an informative message in the echo area) for interactive calls only. There are three ways to do this. The recommended way to test whether the function was called using call-interactively is to give it an optional argument print-message and use the interactive spec to make it non-nil in interactive calls. Here’s an example:

(defun foo (&optional print-message)
  (interactive "p")
  (when print-message
    (message "foo")))

We use "p" because the numeric prefix argument is never nil. Defined in this way, the function does display the message when called from a keyboard macro.

The above method with the additional argument is usually best, because it allows callers to say “treat this call as interactive”. But you can also do the job by testing called-interactively-p.

Function: called-interactively-p kind

This function returns t when the calling function was called using call-interactively.

The argument kind should be either the symbol interactive or the symbol any. If it is interactive, then called-interactively-p returns t only if the call was made directly by the user—e.g., if the user typed a key sequence bound to the calling function, but not if the user ran a keyboard macro that called the function (see section Keyboard Macros). If kind is any, called-interactively-p returns t for any kind of interactive call, including keyboard macros.

If in doubt, use any; the only known proper use of interactive is if you need to decide whether to display a helpful message while a function is running.

A function is never considered to be called interactively if it was called via Lisp evaluation (or with apply or funcall).

Here is an example of using called-interactively-p:

(defun foo ()
  (interactive)
  (when (called-interactively-p 'any)
    (message "Interactive!")
    'foo-called-interactively))
;; Type M-x foo.
     -| Interactive!
(foo)
     ⇒ nil

Here is another example that contrasts direct and indirect calls to called-interactively-p.

(defun bar ()
  (interactive)
  (message "%s" (list (foo) (called-interactively-p 'any))))
;; Type M-x bar.
     -| (nil t)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.5 Information from the Command Loop

The editor command loop sets several Lisp variables to keep status records for itself and for commands that are run. With the exception of this-command and last-command it’s generally a bad idea to change any of these variables in a Lisp program.

Variable: last-command

This variable records the name of the previous command executed by the command loop (the one before the current command). Normally the value is a symbol with a function definition, but this is not guaranteed.

The value is copied from this-command when a command returns to the command loop, except when the command has specified a prefix argument for the following command.

This variable is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals.

Variable: real-last-command

This variable is set up by Emacs just like last-command, but never altered by Lisp programs.

Variable: last-repeatable-command

This variable stores the most recently executed command that was not part of an input event. This is the command repeat will try to repeat, See Repeating in The GNU Emacs Manual.

Variable: this-command

This variable records the name of the command now being executed by the editor command loop. Like last-command, it is normally a symbol with a function definition.

The command loop sets this variable just before running a command, and copies its value into last-command when the command finishes (unless the command specified a prefix argument for the following command).

Some commands set this variable during their execution, as a flag for whatever command runs next. In particular, the functions for killing text set this-command to kill-region so that any kill commands immediately following will know to append the killed text to the previous kill.

If you do not want a particular command to be recognized as the previous command in the case where it got an error, you must code that command to prevent this. One way is to set this-command to t at the beginning of the command, and set this-command back to its proper value at the end, like this:

(defun foo (args…)
  (interactive …)
  (let ((old-this-command this-command))
    (setq this-command t)
    …do the work…
    (setq this-command old-this-command)))

We do not bind this-command with let because that would restore the old value in case of error—a feature of let which in this case does precisely what we want to avoid.

Variable: this-original-command

This has the same value as this-command except when command remapping occurs (see section Remapping Commands). In that case, this-command gives the command actually run (the result of remapping), and this-original-command gives the command that was specified to run but remapped into another command.

Function: this-command-keys

This function returns a string or vector containing the key sequence that invoked the present command, plus any previous commands that generated the prefix argument for this command. Any events read by the command using read-event without a timeout get tacked on to the end.

However, if the command has called read-key-sequence, it returns the last read key sequence. See section Key Sequence Input. The value is a string if all events in the sequence were characters that fit in a string. See section Input Events.

(this-command-keys)
;; Now use C-u C-x C-e to evaluate that.
     ⇒ "^U^X^E"
Function: this-command-keys-vector

Like this-command-keys, except that it always returns the events in a vector, so you don’t need to deal with the complexities of storing input events in a string (see section Putting Keyboard Events in Strings).

Function: clear-this-command-keys &optional keep-record

This function empties out the table of events for this-command-keys to return. Unless keep-record is non-nil, it also empties the records that the function recent-keys (see section Recording Input) will subsequently return. This is useful after reading a password, to prevent the password from echoing inadvertently as part of the next command in certain cases.

Variable: last-nonmenu-event

This variable holds the last input event read as part of a key sequence, not counting events resulting from mouse menus.

One use of this variable is for telling x-popup-menu where to pop up a menu. It is also used internally by y-or-n-p (see section Yes-or-No Queries).

Variable: last-command-event

This variable is set to the last input event that was read by the command loop as part of a command. The principal use of this variable is in self-insert-command, which uses it to decide which character to insert.

last-command-event
;; Now use C-u C-x C-e to evaluate that.
     ⇒ 5

The value is 5 because that is the ASCII code for C-e.

Variable: last-event-frame

This variable records which frame the last input event was directed to. Usually this is the frame that was selected when the event was generated, but if that frame has redirected input focus to another frame, the value is the frame to which the event was redirected. See section Input Focus.

If the last event came from a keyboard macro, the value is macro.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.6 Adjusting Point After Commands

It is not easy to display a value of point in the middle of a sequence of text that has the display, composition or is invisible. Therefore, after a command finishes and returns to the command loop, if point is within such a sequence, the command loop normally moves point to the edge of the sequence.

A command can inhibit this feature by setting the variable disable-point-adjustment:

Variable: disable-point-adjustment

If this variable is non-nil when a command returns to the command loop, then the command loop does not check for those text properties, and does not move point out of sequences that have them.

The command loop sets this variable to nil before each command, so if a command sets it, the effect applies only to that command.

Variable: global-disable-point-adjustment

If you set this variable to a non-nil value, the feature of moving point out of these sequences is completely turned off.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7 Input Events

The Emacs command loop reads a sequence of input events that represent keyboard or mouse activity, or system events sent to Emacs. The events for keyboard activity are characters or symbols; other events are always lists. This section describes the representation and meaning of input events in detail.

Function: eventp object

This function returns non-nil if object is an input event or event type.

Note that any symbol might be used as an event or an event type. eventp cannot distinguish whether a symbol is intended by Lisp code to be used as an event. Instead, it distinguishes whether the symbol has actually been used in an event that has been read as input in the current Emacs session. If a symbol has not yet been so used, eventp returns nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.1 Keyboard Events

There are two kinds of input you can get from the keyboard: ordinary keys, and function keys. Ordinary keys correspond to characters; the events they generate are represented in Lisp as characters. The event type of a character event is the character itself (an integer); see Classifying Events.

An input character event consists of a basic code between 0 and 524287, plus any or all of these modifier bits:

meta

The 2**27 bit in the character code indicates a character typed with the meta key held down.

control

The 2**26 bit in the character code indicates a non-ASCII control character.

ASCII control characters such as C-a have special basic codes of their own, so Emacs needs no special bit to indicate them. Thus, the code for C-a is just 1.

But if you type a control combination not in ASCII, such as % with the control key, the numeric value you get is the code for % plus 2**26 (assuming the terminal supports non-ASCII control characters).

shift

The 2**25 bit in the character code indicates an ASCII control character typed with the shift key held down.

For letters, the basic code itself indicates upper versus lower case; for digits and punctuation, the shift key selects an entirely different character with a different basic code. In order to keep within the ASCII character set whenever possible, Emacs avoids using the 2**25 bit for those characters.

However, ASCII provides no way to distinguish C-A from C-a, so Emacs uses the 2**25 bit in C-A and not in C-a.

hyper

The 2**24 bit in the character code indicates a character typed with the hyper key held down.

super

The 2**23 bit in the character code indicates a character typed with the super key held down.

alt

The 2**22 bit in the character code indicates a character typed with the alt key held down. (The key labeled Alt on most keyboards is actually treated as the meta key, not this.)

It is best to avoid mentioning specific bit numbers in your program. To test the modifier bits of a character, use the function event-modifiers (see section Classifying Events). When making key bindings, you can use the read syntax for characters with modifier bits (‘\C-’, ‘\M-’, and so on). For making key bindings with define-key, you can use lists such as (control hyper ?x) to specify the characters (see section Changing Key Bindings). The function event-convert-list converts such a list into an event type (see section Classifying Events).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.2 Function Keys

Most keyboards also have function keys—keys that have names or symbols that are not characters. Function keys are represented in Emacs Lisp as symbols; the symbol’s name is the function key’s label, in lower case. For example, pressing a key labeled F1 generates an input event represented by the symbol f1.

The event type of a function key event is the event symbol itself. See section Classifying Events.

Here are a few special cases in the symbol-naming convention for function keys:

backspace, tab, newline, return, delete

These keys correspond to common ASCII control characters that have special keys on most keyboards.

In ASCII, C-i and TAB are the same character. If the terminal can distinguish between them, Emacs conveys the distinction to Lisp programs by representing the former as the integer 9, and the latter as the symbol tab.

Most of the time, it’s not useful to distinguish the two. So normally local-function-key-map (see section Keymaps for Translating Sequences of Events) is set up to map tab into 9. Thus, a key binding for character code 9 (the character C-i) also applies to tab. Likewise for the other symbols in this group. The function read-char likewise converts these events into characters.

In ASCII, BS is really C-h. But backspace converts into the character code 127 (DEL), not into code 8 (BS). This is what most users prefer.

left, up, right, down

Cursor arrow keys

kp-add, kp-decimal, kp-divide, …

Keypad keys (to the right of the regular keyboard).

kp-0, kp-1, …

Keypad keys with digits.

kp-f1, kp-f2, kp-f3, kp-f4

Keypad PF keys.

kp-home, kp-left, kp-up, kp-right, kp-down

Keypad arrow keys. Emacs normally translates these into the corresponding non-keypad keys home, left, …

kp-prior, kp-next, kp-end, kp-begin, kp-insert, kp-delete

Additional keypad duplicates of keys ordinarily found elsewhere. Emacs normally translates these into the like-named non-keypad keys.

You can use the modifier keys ALT, CTRL, HYPER, META, SHIFT, and SUPER with function keys. The way to represent them is with prefixes in the symbol name:

A-

The alt modifier.

C-

The control modifier.

H-

The hyper modifier.

M-

The meta modifier.

S-

The shift modifier.

s-

The super modifier.

Thus, the symbol for the key F3 with META held down is M-f3. When you use more than one prefix, we recommend you write them in alphabetical order; but the order does not matter in arguments to the key-binding lookup and modification functions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.3 Mouse Events

Emacs supports four kinds of mouse events: click events, drag events, button-down events, and motion events. All mouse events are represented as lists. The CAR of the list is the event type; this says which mouse button was involved, and which modifier keys were used with it. The event type can also distinguish double or triple button presses (see section Repeat Events). The rest of the list elements give position and time information.

For key lookup, only the event type matters: two events of the same type necessarily run the same command. The command can access the full values of these events using the ‘e’ interactive code. See section Code Characters for interactive.

A key sequence that starts with a mouse event is read using the keymaps of the buffer in the window that the mouse was in, not the current buffer. This does not imply that clicking in a window selects that window or its buffer—that is entirely under the control of the command binding of the key sequence.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.4 Click Events

When the user presses a mouse button and releases it at the same location, that generates a click event. All mouse click event share the same format:

(event-type position click-count)
event-type

This is a symbol that indicates which mouse button was used. It is one of the symbols mouse-1, mouse-2, …, where the buttons are numbered left to right.

You can also use prefixes ‘A-’, ‘C-’, ‘H-’, ‘M-’, ‘S-’ and ‘s-’ for modifiers alt, control, hyper, meta, shift and super, just as you would with function keys.

This symbol also serves as the event type of the event. Key bindings describe events by their types; thus, if there is a key binding for mouse-1, that binding would apply to all events whose event-type is mouse-1.

position

This is a mouse position list specifying where the mouse click occurred; see below for details.

click-count

This is the number of rapid repeated presses so far of the same mouse button. See section Repeat Events.

To access the contents of a mouse position list in the position slot of a click event, you should typically use the functions documented in Accessing Mouse Events. The explicit format of the list depends on where the click occurred. For clicks in the text area, mode line, header line, or in the fringe or marginal areas, the mouse position list has the form

(window pos-or-area (x . y) timestamp
 object text-pos (col . row)
 image (dx . dy) (width . height))

The meanings of these list elements are as follows:

window

The window in which the click occurred.

pos-or-area

The buffer position of the character clicked on in the text area; or, if the click was outside the text area, the window area where it occurred. It is one of the symbols mode-line, header-line, vertical-line, left-margin, right-margin, left-fringe, or right-fringe.

In one special case, pos-or-area is a list containing a symbol (one of the symbols listed above) instead of just the symbol. This happens after the imaginary prefix keys for the event are registered by Emacs. See section Key Sequence Input.

x, y

The relative pixel coordinates of the click. For clicks in the text area of a window, the coordinate origin (0 . 0) is taken to be the top left corner of the text area. See section Window Sizes. For clicks in a mode line or header line, the coordinate origin is the top left corner of the window itself. For fringes, margins, and the vertical border, x does not have meaningful data. For fringes and margins, y is relative to the bottom edge of the header line. In all cases, the x and y coordinates increase rightward and downward respectively.

timestamp

The time at which the event occurred, as an integer number of milliseconds since a system-dependent initial time.

object

Either nil if there is no string-type text property at the click position, or a cons cell of the form (string . string-pos) if there is one:

string

The string which was clicked on, including any properties.

string-pos

The position in the string where the click occurred.

text-pos

For clicks on a marginal area or on a fringe, this is the buffer position of the first visible character in the corresponding line in the window. For other events, it is the current buffer position in the window.

col, row

These are the actual column and row coordinate numbers of the glyph under the x, y position. If x lies beyond the last column of actual text on its line, col is reported by adding fictional extra columns that have the default character width. Row 0 is taken to be the header line if the window has one, or the topmost row of the text area otherwise. Column 0 is taken to be the leftmost column of the text area for clicks on a window text area, or the leftmost mode line or header line column for clicks there. For clicks on fringes or vertical borders, these have no meaningful data. For clicks on margins, col is measured from the left edge of the margin area and row is measured from the top of the margin area.

image

This is the image object on which the click occurred. It is either nil if there is no image at the position clicked on, or it is an image object as returned by find-image if click was in an image.

dx, dy

These are the pixel coordinates of the click, relative to the top left corner of object, which is (0 . 0). If object is nil, the coordinates are relative to the top left corner of the character glyph clicked on.

width, height

These are the pixel width and height of object or, if this is nil, those of the character glyph clicked on.

For clicks on a scroll bar, position has this form:

(window area (portion . whole) timestamp part)
window

The window whose scroll bar was clicked on.

area

This is the symbol vertical-scroll-bar.

portion

The number of pixels from the top of the scroll bar to the click position. On some toolkits, including GTK+, Emacs cannot extract this data, so the value is always 0.

whole

The total length, in pixels, of the scroll bar. On some toolkits, including GTK+, Emacs cannot extract this data, so the value is always 0.

timestamp

The time at which the event occurred, in milliseconds. On some toolkits, including GTK+, Emacs cannot extract this data, so the value is always 0.

part

The part of the scroll bar on which the click occurred. It is one of the symbols handle (the scroll bar handle), above-handle (the area above the handle), below-handle (the area below the handle), up (the up arrow at one end of the scroll bar), or down (the down arrow at one end of the scroll bar).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.5 Drag Events

With Emacs, you can have a drag event without even changing your clothes. A drag event happens every time the user presses a mouse button and then moves the mouse to a different character position before releasing the button. Like all mouse events, drag events are represented in Lisp as lists. The lists record both the starting mouse position and the final position, like this:

(event-type
 (window1 START-POSITION)
 (window2 END-POSITION))

For a drag event, the name of the symbol event-type contains the prefix ‘drag-’. For example, dragging the mouse with button 2 held down generates a drag-mouse-2 event. The second and third elements of the event give the starting and ending position of the drag, as mouse position lists (see section Click Events). You can access the second element of any mouse event in the same way. However, the drag event may end outside the boundaries of the frame that was initially selected. In that case, the third element’s position list contains that frame in place of a window.

The ‘drag-’ prefix follows the modifier key prefixes such as ‘C-’ and ‘M-’.

If read-key-sequence receives a drag event that has no key binding, and the corresponding click event does have a binding, it changes the drag event into a click event at the drag’s starting position. This means that you don’t have to distinguish between click and drag events unless you want to.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.6 Button-Down Events

Click and drag events happen when the user releases a mouse button. They cannot happen earlier, because there is no way to distinguish a click from a drag until the button is released.

If you want to take action as soon as a button is pressed, you need to handle button-down events.11 These occur as soon as a button is pressed. They are represented by lists that look exactly like click events (see section Click Events), except that the event-type symbol name contains the prefix ‘down-’. The ‘down-’ prefix follows modifier key prefixes such as ‘C-’ and ‘M-’.

The function read-key-sequence ignores any button-down events that don’t have command bindings; therefore, the Emacs command loop ignores them too. This means that you need not worry about defining button-down events unless you want them to do something. The usual reason to define a button-down event is so that you can track mouse motion (by reading motion events) until the button is released. See section Motion Events.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.7 Repeat Events

If you press the same mouse button more than once in quick succession without moving the mouse, Emacs generates special repeat mouse events for the second and subsequent presses.

The most common repeat events are double-click events. Emacs generates a double-click event when you click a button twice; the event happens when you release the button (as is normal for all click events).

The event type of a double-click event contains the prefix ‘double-’. Thus, a double click on the second mouse button with meta held down comes to the Lisp program as M-double-mouse-2. If a double-click event has no binding, the binding of the corresponding ordinary click event is used to execute it. Thus, you need not pay attention to the double click feature unless you really want to.

When the user performs a double click, Emacs generates first an ordinary click event, and then a double-click event. Therefore, you must design the command binding of the double click event to assume that the single-click command has already run. It must produce the desired results of a double click, starting from the results of a single click.

This is convenient, if the meaning of a double click somehow “builds on” the meaning of a single click—which is recommended user interface design practice for double clicks.

If you click a button, then press it down again and start moving the mouse with the button held down, then you get a double-drag event when you ultimately release the button. Its event type contains ‘double-drag’ instead of just ‘drag’. If a double-drag event has no binding, Emacs looks for an alternate binding as if the event were an ordinary drag.

Before the double-click or double-drag event, Emacs generates a double-down event when the user presses the button down for the second time. Its event type contains ‘double-down’ instead of just ‘down’. If a double-down event has no binding, Emacs looks for an alternate binding as if the event were an ordinary button-down event. If it finds no binding that way either, the double-down event is ignored.

To summarize, when you click a button and then press it again right away, Emacs generates a down event and a click event for the first click, a double-down event when you press the button again, and finally either a double-click or a double-drag event.

If you click a button twice and then press it again, all in quick succession, Emacs generates a triple-down event, followed by either a triple-click or a triple-drag. The event types of these events contain ‘triple’ instead of ‘double’. If any triple event has no binding, Emacs uses the binding that it would use for the corresponding double event.

If you click a button three or more times and then press it again, the events for the presses beyond the third are all triple events. Emacs does not have separate event types for quadruple, quintuple, etc. events. However, you can look at the event list to find out precisely how many times the button was pressed.

Function: event-click-count event

This function returns the number of consecutive button presses that led up to event. If event is a double-down, double-click or double-drag event, the value is 2. If event is a triple event, the value is 3 or greater. If event is an ordinary mouse event (not a repeat event), the value is 1.

User Option: double-click-fuzz

To generate repeat events, successive mouse button presses must be at approximately the same screen position. The value of double-click-fuzz specifies the maximum number of pixels the mouse may be moved (horizontally or vertically) between two successive clicks to make a double-click.

This variable is also the threshold for motion of the mouse to count as a drag.

User Option: double-click-time

To generate repeat events, the number of milliseconds between successive button presses must be less than the value of double-click-time. Setting double-click-time to nil disables multi-click detection entirely. Setting it to t removes the time limit; Emacs then detects multi-clicks by position only.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.8 Motion Events

Emacs sometimes generates mouse motion events to describe motion of the mouse without any button activity. Mouse motion events are represented by lists that look like this:

(mouse-movement POSITION)

position is a mouse position list (see section Click Events), specifying the current position of the mouse cursor. As with the end-position of a drag event, this position list may represent a location outside the boundaries of the initially selected frame, in which case the list contains that frame in place of a window.

The special form track-mouse enables generation of motion events within its body. Outside of track-mouse forms, Emacs does not generate events for mere motion of the mouse, and these events do not appear. See section Mouse Tracking.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.9 Focus Events

Window systems provide general ways for the user to control which window gets keyboard input. This choice of window is called the focus. When the user does something to switch between Emacs frames, that generates a focus event. The normal definition of a focus event, in the global keymap, is to select a new frame within Emacs, as the user would expect. See section Input Focus.

Focus events are represented in Lisp as lists that look like this:

(switch-frame new-frame)

where new-frame is the frame switched to.

Some X window managers are set up so that just moving the mouse into a window is enough to set the focus there. Usually, there is no need for a Lisp program to know about the focus change until some other kind of input arrives. Emacs generates a focus event only when the user actually types a keyboard key or presses a mouse button in the new frame; just moving the mouse between frames does not generate a focus event.

A focus event in the middle of a key sequence would garble the sequence. So Emacs never generates a focus event in the middle of a key sequence. If the user changes focus in the middle of a key sequence—that is, after a prefix key—then Emacs reorders the events so that the focus event comes either before or after the multi-event key sequence, and not within it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.10 Miscellaneous System Events

A few other event types represent occurrences within the system.

(delete-frame (frame))

This kind of event indicates that the user gave the window manager a command to delete a particular window, which happens to be an Emacs frame.

The standard definition of the delete-frame event is to delete frame.

(iconify-frame (frame))

This kind of event indicates that the user iconified frame using the window manager. Its standard definition is ignore; since the frame has already been iconified, Emacs has no work to do. The purpose of this event type is so that you can keep track of such events if you want to.

(make-frame-visible (frame))

This kind of event indicates that the user deiconified frame using the window manager. Its standard definition is ignore; since the frame has already been made visible, Emacs has no work to do.

(wheel-up position)
(wheel-down position)

These kinds of event are generated by moving a mouse wheel. The position element is a mouse position list (see section Click Events), specifying the position of the mouse cursor when the event occurred.

This kind of event is generated only on some kinds of systems. On some systems, mouse-4 and mouse-5 are used instead. For portable code, use the variables mouse-wheel-up-event and mouse-wheel-down-event defined in mwheel.el to determine what event types to expect for the mouse wheel.

(drag-n-drop position files)

This kind of event is generated when a group of files is selected in an application outside of Emacs, and then dragged and dropped onto an Emacs frame.

The element position is a list describing the position of the event, in the same format as used in a mouse-click event (see section Click Events), and files is the list of file names that were dragged and dropped. The usual way to handle this event is by visiting these files.

This kind of event is generated, at present, only on some kinds of systems.

help-echo

This kind of event is generated when a mouse pointer moves onto a portion of buffer text which has a help-echo text property. The generated event has this form:

(help-echo frame help window object pos)

The precise meaning of the event parameters and the way these parameters are used to display the help-echo text are described in Text help-echo.

sigusr1
sigusr2

These events are generated when the Emacs process receives the signals SIGUSR1 and SIGUSR2. They contain no additional data because signals do not carry additional information. They can be useful for debugging (see section Entering the Debugger on an Error).

To catch a user signal, bind the corresponding event to an interactive command in the special-event-map (see section Active Keymaps). The command is called with no arguments, and the specific signal event is available in last-input-event. For example:

(defun sigusr-handler ()
  (interactive)
  (message "Caught signal %S" last-input-event))

(define-key special-event-map [sigusr1] 'sigusr-handler)

To test the signal handler, you can make Emacs send a signal to itself:

(signal-process (emacs-pid) 'sigusr1)
language-change

This kind of event is generated on MS-Windows when the input language has changed. This typically means that the keyboard keys will send to Emacs characters from a different language. The generated event has this form:

(language-change frame codepage language-id)

Here frame is the frame which was current when the input language changed; codepage is the new codepage number; and language-id is the numerical ID of the new input language. The coding-system (see section Coding Systems) that corresponds to codepage is cpcodepage or windows-codepage. To convert language-id to a string (e.g., to use it for various language-dependent features, such as set-language-environment), use the w32-get-locale-info function, like this:

;; Get the abbreviated language name, such as "ENU" for English
(w32-get-locale-info language-id)
;; Get the full English name of the language,
;; such as "English (United States)"
(w32-get-locale-info language-id 4097)
;; Get the full localized name of the language
(w32-get-locale-info language-id t)

If one of these events arrives in the middle of a key sequence—that is, after a prefix key—then Emacs reorders the events so that this event comes either before or after the multi-event key sequence, not within it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.11 Event Examples

If the user presses and releases the left mouse button over the same location, that generates a sequence of events like this:

(down-mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864320))
(mouse-1      (#<window 18 on NEWS> 2613 (0 . 38) -864180))

While holding the control key down, the user might hold down the second mouse button, and drag the mouse from one line to the next. That produces two events, as shown here:

(C-down-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219))
(C-drag-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219)
                (#<window 18 on NEWS> 3510 (0 . 28) -729648))

While holding down the meta and shift keys, the user might press the second mouse button on the window’s mode line, and then drag the mouse into another window. That produces a pair of events like these:

(M-S-down-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844))
(M-S-drag-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844)
                  (#<window 20 on carlton-sanskrit.tex> 161 (33 . 3)
                   -453816))

The frame with input focus might not take up the entire screen, and the user might move the mouse outside the scope of the frame. Inside the track-mouse special form, that produces an event like this:

(mouse-movement (#<frame *ielm* 0x102849a30> nil (563 . 205) 532301936))

To handle a SIGUSR1 signal, define an interactive function, and bind it to the signal usr1 event sequence:

(defun usr1-handler ()
  (interactive)
  (message "Got USR1 signal"))
(global-set-key [signal usr1] 'usr1-handler)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.12 Classifying Events

Every event has an event type, which classifies the event for key binding purposes. For a keyboard event, the event type equals the event value; thus, the event type for a character is the character, and the event type for a function key symbol is the symbol itself. For events that are lists, the event type is the symbol in the CAR of the list. Thus, the event type is always a symbol or a character.

Two events of the same type are equivalent where key bindings are concerned; thus, they always run the same command. That does not necessarily mean they do the same things, however, as some commands look at the whole event to decide what to do. For example, some commands use the location of a mouse event to decide where in the buffer to act.

Sometimes broader classifications of events are useful. For example, you might want to ask whether an event involved the META key, regardless of which other key or mouse button was used.

The functions event-modifiers and event-basic-type are provided to get such information conveniently.

Function: event-modifiers event

This function returns a list of the modifiers that event has. The modifiers are symbols; they include shift, control, meta, alt, hyper and super. In addition, the modifiers list of a mouse event symbol always contains one of click, drag, and down. For double or triple events, it also contains double or triple.

The argument event may be an entire event object, or just an event type. If event is a symbol that has never been used in an event that has been read as input in the current Emacs session, then event-modifiers can return nil, even when event actually has modifiers.

Here are some examples:

(event-modifiers ?a)
     ⇒ nil
(event-modifiers ?A)
     ⇒ (shift)
(event-modifiers ?\C-a)
     ⇒ (control)
(event-modifiers ?\C-%)
     ⇒ (control)
(event-modifiers ?\C-\S-a)
     ⇒ (control shift)
(event-modifiers 'f5)
     ⇒ nil
(event-modifiers 's-f5)
     ⇒ (super)
(event-modifiers 'M-S-f5)
     ⇒ (meta shift)
(event-modifiers 'mouse-1)
     ⇒ (click)
(event-modifiers 'down-mouse-1)
     ⇒ (down)

The modifiers list for a click event explicitly contains click, but the event symbol name itself does not contain ‘click’.

Function: event-basic-type event

This function returns the key or mouse button that event describes, with all modifiers removed. The event argument is as in event-modifiers. For example:

(event-basic-type ?a)
     ⇒ 97
(event-basic-type ?A)
     ⇒ 97
(event-basic-type ?\C-a)
     ⇒ 97
(event-basic-type ?\C-\S-a)
     ⇒ 97
(event-basic-type 'f5)
     ⇒ f5
(event-basic-type 's-f5)
     ⇒ f5
(event-basic-type 'M-S-f5)
     ⇒ f5
(event-basic-type 'down-mouse-1)
     ⇒ mouse-1
Function: mouse-movement-p object

This function returns non-nil if object is a mouse movement event.

Function: event-convert-list list

This function converts a list of modifier names and a basic event type to an event type which specifies all of them. The basic event type must be the last element of the list. For example,

(event-convert-list '(control ?a))
     ⇒ 1
(event-convert-list '(control meta ?a))
     ⇒ -134217727
(event-convert-list '(control super f1))
     ⇒ C-s-f1

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.13 Accessing Mouse Events

This section describes convenient functions for accessing the data in a mouse button or motion event. Keyboard event data can be accessed using the same functions, but data elements that aren’t applicable to keyboard events are zero or nil.

The following two functions return a mouse position list (see section Click Events), specifying the position of a mouse event.

Function: event-start event

This returns the starting position of event.

If event is a click or button-down event, this returns the location of the event. If event is a drag event, this returns the drag’s starting position.

Function: event-end event

This returns the ending position of event.

If event is a drag event, this returns the position where the user released the mouse button. If event is a click or button-down event, the value is actually the starting position, which is the only position such events have.

Function: posnp object

This function returns non-nil if object is a mouse position list, in either of the formats documented in Click Events); and nil otherwise.

These functions take a mouse position list as argument, and return various parts of it:

Function: posn-window position

Return the window that position is in. If position represents a location outside the frame where the event was initiated, return that frame instead.

Function: posn-area position

Return the window area recorded in position. It returns nil when the event occurred in the text area of the window; otherwise, it is a symbol identifying the area in which the event occurred.

Function: posn-point position

Return the buffer position in position. When the event occurred in the text area of the window, in a marginal area, or on a fringe, this is an integer specifying a buffer position. Otherwise, the value is undefined.

Function: posn-x-y position

Return the pixel-based x and y coordinates in position, as a cons cell (x . y). These coordinates are relative to the window given by posn-window.

This example shows how to convert the window-relative coordinates in the text area of a window into frame-relative coordinates:

(defun frame-relative-coordinates (position)
  "Return frame-relative coordinates from POSITION.
POSITION is assumed to lie in a window text area."
  (let* ((x-y (posn-x-y position))
         (window (posn-window position))
         (edges (window-inside-pixel-edges window)))
    (cons (+ (car x-y) (car edges))
          (+ (cdr x-y) (cadr edges)))))
Function: posn-col-row position

This function returns a cons cell (col . row), containing the estimated column and row corresponding to buffer position in position. The return value is given in units of the frame’s default character width and default line height (including spacing), as computed from the x and y values corresponding to position. (So, if the actual characters have non-default sizes, the actual row and column may differ from these computed values.)

Note that row is counted from the top of the text area. If the window given by position possesses a header line (see section Window Header Lines), it is not included in the row count.

Function: posn-actual-col-row position

Return the actual row and column in position, as a cons cell (col . row). The values are the actual row and column numbers in the window given by position. See section Click Events, for details. The function returns nil if position does not include actual position values; in that case posn-col-row can be used to get approximate values.

Note that this function doesn’t account for the visual width of characters on display, like the number of visual columns taken by a tab character or an image. If you need the coordinates in canonical character units, use posn-col-row instead.

Function: posn-string position

Return the string object in position, either nil, or a cons cell (string . string-pos).

Function: posn-image position

Return the image object in position, either nil, or an image (image ...).

Function: posn-object position

Return the image or string object in position, either nil, an image (image ...), or a cons cell (string . string-pos).

Function: posn-object-x-y position

Return the pixel-based x and y coordinates relative to the upper left corner of the object in position as a cons cell (dx . dy). If the position is on buffer text, return the relative position of the buffer-text character closest to that position.

Function: posn-object-width-height position

Return the pixel width and height of the object in position as a cons cell (width . height). If the position is a buffer position, return the size of the character at that position.

Function: posn-timestamp position

Return the timestamp in position. This is the time at which the event occurred, in milliseconds.

These functions compute a position list given particular buffer position or screen position. You can access the data in this position list with the functions described above.

Function: posn-at-point &optional pos window

This function returns a position list for position pos in window. pos defaults to point in window; window defaults to the selected window.

posn-at-point returns nil if pos is not visible in window.

Function: posn-at-x-y x y &optional frame-or-window whole

This function returns position information corresponding to pixel coordinates x and y in a specified frame or window, frame-or-window, which defaults to the selected window. The coordinates x and y are relative to the frame or window used. If whole is nil, the coordinates are relative to the window text area, otherwise they are relative to the entire window area including scroll bars, margins and fringes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.14 Accessing Scroll Bar Events

These functions are useful for decoding scroll bar events.

Function: scroll-bar-event-ratio event

This function returns the fractional vertical position of a scroll bar event within the scroll bar. The value is a cons cell (portion . whole) containing two integers whose ratio is the fractional position.

Function: scroll-bar-scale ratio total

This function multiplies (in effect) ratio by total, rounding the result to an integer. The argument ratio is not a number, but rather a pair (num . denom)—typically a value returned by scroll-bar-event-ratio.

This function is handy for scaling a position on a scroll bar into a buffer position. Here’s how to do that:

(+ (point-min)
   (scroll-bar-scale
      (posn-x-y (event-start event))
      (- (point-max) (point-min))))

Recall that scroll bar events have two integers forming a ratio, in place of a pair of x and y coordinates.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.15 Putting Keyboard Events in Strings

In most of the places where strings are used, we conceptualize the string as containing text characters—the same kind of characters found in buffers or files. Occasionally Lisp programs use strings that conceptually contain keyboard characters; for example, they may be key sequences or keyboard macro definitions. However, storing keyboard characters in a string is a complex matter, for reasons of historical compatibility, and it is not always possible.

We recommend that new programs avoid dealing with these complexities by not storing keyboard events in strings. Here is how to do that:

The complexities stem from the modifier bits that keyboard input characters can include. Aside from the Meta modifier, none of these modifier bits can be included in a string, and the Meta modifier is allowed only in special cases.

The earliest GNU Emacs versions represented meta characters as codes in the range of 128 to 255. At that time, the basic character codes ranged from 0 to 127, so all keyboard character codes did fit in a string. Many Lisp programs used ‘\M-’ in string constants to stand for meta characters, especially in arguments to define-key and similar functions, and key sequences and sequences of events were always represented as strings.

When we added support for larger basic character codes beyond 127, and additional modifier bits, we had to change the representation of meta characters. Now the flag that represents the Meta modifier in a character is 2**27 and such numbers cannot be included in a string.

To support programs with ‘\M-’ in string constants, there are special rules for including certain meta characters in a string. Here are the rules for interpreting a string as a sequence of input characters:

Functions such as read-key-sequence that construct strings of keyboard input characters follow these rules: they construct vectors instead of strings, when the events won’t fit in a string.

When you use the read syntax ‘\M-’ in a string, it produces a code in the range of 128 to 255—the same code that you get if you modify the corresponding keyboard event to put it in the string. Thus, meta events in strings work consistently regardless of how they get into the strings.

However, most programs would do well to avoid these issues by following the recommendations at the beginning of this section.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8 Reading Input

The editor command loop reads key sequences using the function read-key-sequence, which uses read-event. These and other functions for event input are also available for use in Lisp programs. See also momentary-string-display in Temporary Displays, and sit-for in Waiting for Elapsed Time or Input. See section Terminal Input, for functions and variables for controlling terminal input modes and debugging terminal input.

For higher-level input facilities, see Minibuffers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.1 Key Sequence Input

The command loop reads input a key sequence at a time, by calling read-key-sequence. Lisp programs can also call this function; for example, describe-key uses it to read the key to describe.

Function: read-key-sequence prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop

This function reads a key sequence and returns it as a string or vector. It keeps reading events until it has accumulated a complete key sequence; that is, enough to specify a non-prefix command using the currently active keymaps. (Remember that a key sequence that starts with a mouse event is read using the keymaps of the buffer in the window that the mouse was in, not the current buffer.)

If the events are all characters and all can fit in a string, then read-key-sequence returns a string (see section Putting Keyboard Events in Strings). Otherwise, it returns a vector, since a vector can hold all kinds of events—characters, symbols, and lists. The elements of the string or vector are the events in the key sequence.

Reading a key sequence includes translating the events in various ways. See section Keymaps for Translating Sequences of Events.

The argument prompt is either a string to be displayed in the echo area as a prompt, or nil, meaning not to display a prompt. The argument continue-echo, if non-nil, means to echo this key as a continuation of the previous key.

Normally any upper case event is converted to lower case if the original event is undefined and the lower case equivalent is defined. The argument dont-downcase-last, if non-nil, means do not convert the last event to lower case. This is appropriate for reading a key sequence to be defined.

The argument switch-frame-ok, if non-nil, means that this function should process a switch-frame event if the user switches frames before typing anything. If the user switches frames in the middle of a key sequence, or at the start of the sequence but switch-frame-ok is nil, then the event will be put off until after the current key sequence.

The argument command-loop, if non-nil, means that this key sequence is being read by something that will read commands one after another. It should be nil if the caller will read just one key sequence.

In the following example, Emacs displays the prompt ‘?’ in the echo area, and then the user types C-x C-f.

(read-key-sequence "?")

---------- Echo Area ----------
?C-x C-f
---------- Echo Area ----------

     ⇒ "^X^F"

The function read-key-sequence suppresses quitting: C-g typed while reading with this function works like any other character, and does not set quit-flag. See section Quitting.

Function: read-key-sequence-vector prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop

This is like read-key-sequence except that it always returns the key sequence as a vector, never as a string. See section Putting Keyboard Events in Strings.

If an input character is upper-case (or has the shift modifier) and has no key binding, but its lower-case equivalent has one, then read-key-sequence converts the character to lower case. Note that lookup-key does not perform case conversion in this way.

When reading input results in such a shift-translation, Emacs sets the variable this-command-keys-shift-translated to a non-nil value. Lisp programs can examine this variable if they need to modify their behavior when invoked by shift-translated keys. For example, the function handle-shift-selection examines the value of this variable to determine how to activate or deactivate the region (see section handle-shift-selection).

The function read-key-sequence also transforms some mouse events. It converts unbound drag events into click events, and discards unbound button-down events entirely. It also reshuffles focus events and miscellaneous window events so that they never appear in a key sequence with any other events.

When mouse events occur in special parts of a window, such as a mode line or a scroll bar, the event type shows nothing special—it is the same symbol that would normally represent that combination of mouse button and modifier keys. The information about the window part is kept elsewhere in the event—in the coordinates. But read-key-sequence translates this information into imaginary “prefix keys”, all of which are symbols: header-line, horizontal-scroll-bar, menu-bar, mode-line, vertical-line, and vertical-scroll-bar. You can define meanings for mouse clicks in special window parts by defining key sequences using these imaginary prefix keys.

For example, if you call read-key-sequence and then click the mouse on the window’s mode line, you get two events, like this:

(read-key-sequence "Click on the mode line: ")
     ⇒ [mode-line
         (mouse-1
          (#<window 6 on NEWS> mode-line
           (40 . 63) 5959987))]
Variable: num-input-keys

This variable’s value is the number of key sequences processed so far in this Emacs session. This includes key sequences read from the terminal and key sequences read from keyboard macros being executed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.2 Reading One Event

The lowest level functions for command input are read-event, read-char, and read-char-exclusive.

Function: read-event &optional prompt inherit-input-method seconds

This function reads and returns the next event of command input, waiting if necessary until an event is available.

The returned event may come directly from the user, or from a keyboard macro. It is not decoded by the keyboard’s input coding system (see section Terminal I/O Encoding).

If the optional argument prompt is non-nil, it should be a string to display in the echo area as a prompt. Otherwise, read-event does not display any message to indicate it is waiting for input; instead, it prompts by echoing: it displays descriptions of the events that led to or were read by the current command. See section The Echo Area.

If inherit-input-method is non-nil, then the current input method (if any) is employed to make it possible to enter a non-ASCII character. Otherwise, input method handling is disabled for reading this event.

If cursor-in-echo-area is non-nil, then read-event moves the cursor temporarily to the echo area, to the end of any message displayed there. Otherwise read-event does not move the cursor.

If seconds is non-nil, it should be a number specifying the maximum time to wait for input, in seconds. If no input arrives within that time, read-event stops waiting and returns nil. A floating point seconds means to wait for a fractional number of seconds. Some systems support only a whole number of seconds; on these systems, seconds is rounded down. If seconds is nil, read-event waits as long as necessary for input to arrive.

If seconds is nil, Emacs is considered idle while waiting for user input to arrive. Idle timers—those created with run-with-idle-timer (see section Idle Timers)—can run during this period. However, if seconds is non-nil, the state of idleness remains unchanged. If Emacs is non-idle when read-event is called, it remains non-idle throughout the operation of read-event; if Emacs is idle (which can happen if the call happens inside an idle timer), it remains idle.

If read-event gets an event that is defined as a help character, then in some cases read-event processes the event directly without returning. See section Help Functions. Certain other events, called special events, are also processed directly within read-event (see section Special Events).

Here is what happens if you call read-event and then press the right-arrow function key:

(read-event)
     ⇒ right
Function: read-char &optional prompt inherit-input-method seconds

This function reads and returns a character of command input. If the user generates an event which is not a character (i.e., a mouse click or function key event), read-char signals an error. The arguments work as in read-event.

In the first example, the user types the character 1 (ASCII code 49). The second example shows a keyboard macro definition that calls read-char from the minibuffer using eval-expression. read-char reads the keyboard macro’s very next character, which is 1. Then eval-expression displays its return value in the echo area.

(read-char)
     ⇒ 49
;; We assume here you use M-: to evaluate this.
(symbol-function 'foo)
     ⇒ "^[:(read-char)^M1"
(execute-kbd-macro 'foo)
     -| 49
     ⇒ nil
Function: read-char-exclusive &optional prompt inherit-input-method seconds

This function reads and returns a character of command input. If the user generates an event which is not a character, read-char-exclusive ignores it and reads another event, until it gets a character. The arguments work as in read-event.

None of the above functions suppress quitting.

Variable: num-nonmacro-input-events

This variable holds the total number of input events received so far from the terminal—not counting those generated by keyboard macros.

We emphasize that, unlike read-key-sequence, the functions read-event, read-char, and read-char-exclusive do not perform the translations described in Keymaps for Translating Sequences of Events. If you wish to read a single key taking these translations into account, use the function read-key:

Function: read-key &optional prompt

This function reads a single key. It is “intermediate” between read-key-sequence and read-event. Unlike the former, it reads a single key, not a key sequence. Unlike the latter, it does not return a raw event, but decodes and translates the user input according to input-decode-map, local-function-key-map, and key-translation-map (see section Keymaps for Translating Sequences of Events).

The argument prompt is either a string to be displayed in the echo area as a prompt, or nil, meaning not to display a prompt.

Function: read-char-choice prompt chars &optional inhibit-quit

This function uses read-key to read and return a single character. It ignores any input that is not a member of chars, a list of accepted characters. Optionally, it will also ignore keyboard-quit events while it is waiting for valid input. If you bind help-form (see section Help Functions) to a non-nil value while calling read-char-choice, then pressing help-char causes it to evaluate help-form and display the result. It then continues to wait for a valid input character, or keyboard-quit.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.3 Modifying and Translating Input Events

Emacs modifies every event it reads according to extra-keyboard-modifiers, then translates it through keyboard-translate-table (if applicable), before returning it from read-event.

Variable: extra-keyboard-modifiers

This variable lets Lisp programs “press” the modifier keys on the keyboard. The value is a character. Only the modifiers of the character matter. Each time the user types a keyboard key, it is altered as if those modifier keys were held down. For instance, if you bind extra-keyboard-modifiers to ?\C-\M-a, then all keyboard input characters typed during the scope of the binding will have the control and meta modifiers applied to them. The character ?\C-@, equivalent to the integer 0, does not count as a control character for this purpose, but as a character with no modifiers. Thus, setting extra-keyboard-modifiers to zero cancels any modification.

When using a window system, the program can “press” any of the modifier keys in this way. Otherwise, only the CTL and META keys can be virtually pressed.

Note that this variable applies only to events that really come from the keyboard, and has no effect on mouse events or any other events.

Variable: keyboard-translate-table

This terminal-local variable is the translate table for keyboard characters. It lets you reshuffle the keys on the keyboard without changing any command bindings. Its value is normally a char-table, or else nil. (It can also be a string or vector, but this is considered obsolete.)

If keyboard-translate-table is a char-table (see section Char-Tables), then each character read from the keyboard is looked up in this char-table. If the value found there is non-nil, then it is used instead of the actual input character.

Note that this translation is the first thing that happens to a character after it is read from the terminal. Record-keeping features such as recent-keys and dribble files record the characters after translation.

Note also that this translation is done before the characters are supplied to input methods (see section Input Methods). Use translation-table-for-input (see section Translation of Characters), if you want to translate characters after input methods operate.

Function: keyboard-translate from to

This function modifies keyboard-translate-table to translate character code from into character code to. It creates the keyboard translate table if necessary.

Here’s an example of using the keyboard-translate-table to make C-x, C-c and C-v perform the cut, copy and paste operations:

(keyboard-translate ?\C-x 'control-x)
(keyboard-translate ?\C-c 'control-c)
(keyboard-translate ?\C-v 'control-v)
(global-set-key [control-x] 'kill-region)
(global-set-key [control-c] 'kill-ring-save)
(global-set-key [control-v] 'yank)

On a graphical terminal that supports extended ASCII input, you can still get the standard Emacs meanings of one of those characters by typing it with the shift key. That makes it a different character as far as keyboard translation is concerned, but it has the same usual meaning.

See section Keymaps for Translating Sequences of Events, for mechanisms that translate event sequences at the level of read-key-sequence.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.4 Invoking the Input Method

The event-reading functions invoke the current input method, if any (see section Input Methods). If the value of input-method-function is non-nil, it should be a function; when read-event reads a printing character (including SPC) with no modifier bits, it calls that function, passing the character as an argument.

Variable: input-method-function

If this is non-nil, its value specifies the current input method function.

Warning: don’t bind this variable with let. It is often buffer-local, and if you bind it around reading input (which is exactly when you would bind it), switching buffers asynchronously while Emacs is waiting will cause the value to be restored in the wrong buffer.

The input method function should return a list of events which should be used as input. (If the list is nil, that means there is no input, so read-event waits for another event.) These events are processed before the events in unread-command-events (see section Miscellaneous Event Input Features). Events returned by the input method function are not passed to the input method function again, even if they are printing characters with no modifier bits.

If the input method function calls read-event or read-key-sequence, it should bind input-method-function to nil first, to prevent recursion.

The input method function is not called when reading the second and subsequent events of a key sequence. Thus, these characters are not subject to input method processing. The input method function should test the values of overriding-local-map and overriding-terminal-local-map; if either of these variables is non-nil, the input method should put its argument into a list and return that list with no further processing.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.5 Quoted Character Input

You can use the function read-quoted-char to ask the user to specify a character, and allow the user to specify a control or meta character conveniently, either literally or as an octal character code. The command quoted-insert uses this function.

Function: read-quoted-char &optional prompt

This function is like read-char, except that if the first character read is an octal digit (0–7), it reads any number of octal digits (but stopping if a non-octal digit is found), and returns the character represented by that numeric character code. If the character that terminates the sequence of octal digits is RET, it is discarded. Any other terminating character is used as input after this function returns.

Quitting is suppressed when the first character is read, so that the user can enter a C-g. See section Quitting.

If prompt is supplied, it specifies a string for prompting the user. The prompt string is always displayed in the echo area, followed by a single ‘-’.

In the following example, the user types in the octal number 177 (which is 127 in decimal).

(read-quoted-char "What character")

---------- Echo Area ----------
What character 1 7 7-
---------- Echo Area ----------

     ⇒ 127

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.6 Miscellaneous Event Input Features

This section describes how to “peek ahead” at events without using them up, how to check for pending input, and how to discard pending input. See also the function read-passwd (see section Reading a Password).

Variable: unread-command-events

This variable holds a list of events waiting to be read as command input. The events are used in the order they appear in the list, and removed one by one as they are used.

The variable is needed because in some cases a function reads an event and then decides not to use it. Storing the event in this variable causes it to be processed normally, by the command loop or by the functions to read command input.

For example, the function that implements numeric prefix arguments reads any number of digits. When it finds a non-digit event, it must unread the event so that it can be read normally by the command loop. Likewise, incremental search uses this feature to unread events with no special meaning in a search, because these events should exit the search and then execute normally.

The reliable and easy way to extract events from a key sequence so as to put them in unread-command-events is to use listify-key-sequence (see below).

Normally you add events to the front of this list, so that the events most recently unread will be reread first.

Events read from this list are not normally added to the current command’s key sequence (as returned by, e.g., this-command-keys), as the events will already have been added once as they were read for the first time. An element of the form (t . event) forces event to be added to the current command’s key sequence.

Function: listify-key-sequence key

This function converts the string or vector key to a list of individual events, which you can put in unread-command-events.

Function: input-pending-p &optional check-timers

This function determines whether any command input is currently available to be read. It returns immediately, with value t if there is available input, nil otherwise. On rare occasions it may return t when no input is available.

If the optional argument check-timers is non-nil, then if no input is available, Emacs runs any timers which are ready. See section Timers for Delayed Execution.

Variable: last-input-event

This variable records the last terminal input event read, whether as part of a command or explicitly by a Lisp program.

In the example below, the Lisp program reads the character 1, ASCII code 49. It becomes the value of last-input-event, while C-e (we assume C-x C-e command is used to evaluate this expression) remains the value of last-command-event.

(progn (print (read-char))
       (print last-command-event)
       last-input-event)
     -| 49
     -| 5
     ⇒ 49
Macro: while-no-input body…

This construct runs the body forms and returns the value of the last one—but only if no input arrives. If any input arrives during the execution of the body forms, it aborts them (working much like a quit). The while-no-input form returns nil if aborted by a real quit, and returns t if aborted by arrival of other input.

If a part of body binds inhibit-quit to non-nil, arrival of input during those parts won’t cause an abort until the end of that part.

If you want to be able to distinguish all possible values computed by body from both kinds of abort conditions, write the code like this:

(while-no-input
  (list
    (progn . body)))
Function: discard-input

This function discards the contents of the terminal input buffer and cancels any keyboard macro that might be in the process of definition. It returns nil.

In the following example, the user may type a number of characters right after starting the evaluation of the form. After the sleep-for finishes sleeping, discard-input discards any characters typed during the sleep.

(progn (sleep-for 2)
       (discard-input))
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.9 Special Events

Certain special events are handled at a very low level—as soon as they are read. The read-event function processes these events itself, and never returns them. Instead, it keeps waiting for the first event that is not special and returns that one.

Special events do not echo, they are never grouped into key sequences, and they never appear in the value of last-command-event or (this-command-keys). They do not discard a numeric argument, they cannot be unread with unread-command-events, they may not appear in a keyboard macro, and they are not recorded in a keyboard macro while you are defining one.

Special events do, however, appear in last-input-event immediately after they are read, and this is the way for the event’s definition to find the actual event.

The events types iconify-frame, make-frame-visible, delete-frame, drag-n-drop, language-change, and user signals like sigusr1 are normally handled in this way. The keymap which defines how to handle special events—and which events are special—is in the variable special-event-map (see section Active Keymaps).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.10 Waiting for Elapsed Time or Input

The wait functions are designed to wait for a certain amount of time to pass or until there is input. For example, you may wish to pause in the middle of a computation to allow the user time to view the display. sit-for pauses and updates the screen, and returns immediately if input comes in, while sleep-for pauses without updating the screen.

Function: sit-for seconds &optional nodisp

This function performs redisplay (provided there is no pending input from the user), then waits seconds seconds, or until input is available. The usual purpose of sit-for is to give the user time to read text that you display. The value is t if sit-for waited the full time with no input arriving (see section Miscellaneous Event Input Features). Otherwise, the value is nil.

The argument seconds need not be an integer. If it is floating point, sit-for waits for a fractional number of seconds. Some systems support only a whole number of seconds; on these systems, seconds is rounded down.

The expression (sit-for 0) is equivalent to (redisplay), i.e., it requests a redisplay, without any delay, if there is no pending input. See section Forcing Redisplay.

If nodisp is non-nil, then sit-for does not redisplay, but it still returns as soon as input is available (or when the timeout elapses).

In batch mode (see section Batch Mode), sit-for cannot be interrupted, even by input from the standard input descriptor. It is thus equivalent to sleep-for, which is described below.

It is also possible to call sit-for with three arguments, as (sit-for seconds millisec nodisp), but that is considered obsolete.

Function: sleep-for seconds &optional millisec

This function simply pauses for seconds seconds without updating the display. It pays no attention to available input. It returns nil.

The argument seconds need not be an integer. If it is floating point, sleep-for waits for a fractional number of seconds. Some systems support only a whole number of seconds; on these systems, seconds is rounded down.

The optional argument millisec specifies an additional waiting period measured in milliseconds. This adds to the period specified by seconds. If the system doesn’t support waiting fractions of a second, you get an error if you specify nonzero millisec.

Use sleep-for when you wish to guarantee a delay.

See section Time of Day, for functions to get the current time.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.11 Quitting

Typing C-g while a Lisp function is running causes Emacs to quit whatever it is doing. This means that control returns to the innermost active command loop.

Typing C-g while the command loop is waiting for keyboard input does not cause a quit; it acts as an ordinary input character. In the simplest case, you cannot tell the difference, because C-g normally runs the command keyboard-quit, whose effect is to quit. However, when C-g follows a prefix key, they combine to form an undefined key. The effect is to cancel the prefix key as well as any prefix argument.

In the minibuffer, C-g has a different definition: it aborts out of the minibuffer. This means, in effect, that it exits the minibuffer and then quits. (Simply quitting would return to the command loop within the minibuffer.) The reason why C-g does not quit directly when the command reader is reading input is so that its meaning can be redefined in the minibuffer in this way. C-g following a prefix key is not redefined in the minibuffer, and it has its normal effect of canceling the prefix key and prefix argument. This too would not be possible if C-g always quit directly.

When C-g does directly quit, it does so by setting the variable quit-flag to t. Emacs checks this variable at appropriate times and quits if it is not nil. Setting quit-flag non-nil in any way thus causes a quit.

At the level of C code, quitting cannot happen just anywhere; only at the special places that check quit-flag. The reason for this is that quitting at other places might leave an inconsistency in Emacs’s internal state. Because quitting is delayed until a safe place, quitting cannot make Emacs crash.

Certain functions such as read-key-sequence or read-quoted-char prevent quitting entirely even though they wait for input. Instead of quitting, C-g serves as the requested input. In the case of read-key-sequence, this serves to bring about the special behavior of C-g in the command loop. In the case of read-quoted-char, this is so that C-q can be used to quote a C-g.

You can prevent quitting for a portion of a Lisp function by binding the variable inhibit-quit to a non-nil value. Then, although C-g still sets quit-flag to t as usual, the usual result of this—a quit—is prevented. Eventually, inhibit-quit will become nil again, such as when its binding is unwound at the end of a let form. At that time, if quit-flag is still non-nil, the requested quit happens immediately. This behavior is ideal when you wish to make sure that quitting does not happen within a “critical section” of the program.

In some functions (such as read-quoted-char), C-g is handled in a special way that does not involve quitting. This is done by reading the input with inhibit-quit bound to t, and setting quit-flag to nil before inhibit-quit becomes nil again. This excerpt from the definition of read-quoted-char shows how this is done; it also shows that normal quitting is permitted after the first character of input.

(defun read-quoted-char (&optional prompt)
  "…documentation…"
  (let ((message-log-max nil) done (first t) (code 0) char)
    (while (not done)
      (let ((inhibit-quit first)
            …)
        (and prompt (message "%s-" prompt))
        (setq char (read-event))
        (if inhibit-quit (setq quit-flag nil)))
      …set the variable code)
    code))
Variable: quit-flag

If this variable is non-nil, then Emacs quits immediately, unless inhibit-quit is non-nil. Typing C-g ordinarily sets quit-flag non-nil, regardless of inhibit-quit.

Variable: inhibit-quit

This variable determines whether Emacs should quit when quit-flag is set to a value other than nil. If inhibit-quit is non-nil, then quit-flag has no special effect.

Macro: with-local-quit body…

This macro executes body forms in sequence, but allows quitting, at least locally, within body even if inhibit-quit was non-nil outside this construct. It returns the value of the last form in body, unless exited by quitting, in which case it returns nil.

If inhibit-quit is nil on entry to with-local-quit, it only executes the body, and setting quit-flag causes a normal quit. However, if inhibit-quit is non-nil so that ordinary quitting is delayed, a non-nil quit-flag triggers a special kind of local quit. This ends the execution of body and exits the with-local-quit body with quit-flag still non-nil, so that another (ordinary) quit will happen as soon as that is allowed. If quit-flag is already non-nil at the beginning of body, the local quit happens immediately and the body doesn’t execute at all.

This macro is mainly useful in functions that can be called from timers, process filters, process sentinels, pre-command-hook, post-command-hook, and other places where inhibit-quit is normally bound to t.

Command: keyboard-quit

This function signals the quit condition with (signal 'quit nil). This is the same thing that quitting does. (See signal in Errors.)

You can specify a character other than C-g to use for quitting. See the function set-input-mode in Input Modes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.12 Prefix Command Arguments

Most Emacs commands can use a prefix argument, a number specified before the command itself. (Don’t confuse prefix arguments with prefix keys.) The prefix argument is at all times represented by a value, which may be nil, meaning there is currently no prefix argument. Each command may use the prefix argument or ignore it.

There are two representations of the prefix argument: raw and numeric. The editor command loop uses the raw representation internally, and so do the Lisp variables that store the information, but commands can request either representation.

Here are the possible values of a raw prefix argument:

We illustrate these possibilities by calling the following function with various prefixes:

(defun display-prefix (arg)
  "Display the value of the raw prefix arg."
  (interactive "P")
  (message "%s" arg))

Here are the results of calling display-prefix with various raw prefix arguments:

        M-x display-prefix  -| nil

C-u     M-x display-prefix  -| (4)

C-u C-u M-x display-prefix  -| (16)

C-u 3   M-x display-prefix  -| 3

M-3     M-x display-prefix  -| 3      ; (Same as C-u 3.)

C-u -   M-x display-prefix  -| -

M--     M-x display-prefix  -| -      ; (Same as C-u -.)

C-u - 7 M-x display-prefix  -| -7

M-- 7   M-x display-prefix  -| -7     ; (Same as C-u -7.)

Emacs uses two variables to store the prefix argument: prefix-arg and current-prefix-arg. Commands such as universal-argument that set up prefix arguments for other commands store them in prefix-arg. In contrast, current-prefix-arg conveys the prefix argument to the current command, so setting it has no effect on the prefix arguments for future commands.

Normally, commands specify which representation to use for the prefix argument, either numeric or raw, in the interactive specification. (See section Using interactive.) Alternatively, functions may look at the value of the prefix argument directly in the variable current-prefix-arg, but this is less clean.

Function: prefix-numeric-value arg

This function returns the numeric meaning of a valid raw prefix argument value, arg. The argument may be a symbol, a number, or a list. If it is nil, the value 1 is returned; if it is -, the value -1 is returned; if it is a number, that number is returned; if it is a list, the CAR of that list (which should be a number) is returned.

Variable: current-prefix-arg

This variable holds the raw prefix argument for the current command. Commands may examine it directly, but the usual method for accessing it is with (interactive "P").

Variable: prefix-arg

The value of this variable is the raw prefix argument for the next editing command. Commands such as universal-argument that specify prefix arguments for the following command work by setting this variable.

Variable: last-prefix-arg

The raw prefix argument value used by the previous command.

The following commands exist to set up prefix arguments for the following command. Do not call them for any other reason.

Command: universal-argument

This command reads input and specifies a prefix argument for the following command. Don’t call this command yourself unless you know what you are doing.

Command: digit-argument arg

This command adds to the prefix argument for the following command. The argument arg is the raw prefix argument as it was before this command; it is used to compute the updated prefix argument. Don’t call this command yourself unless you know what you are doing.

Command: negative-argument arg

This command adds to the numeric argument for the next command. The argument arg is the raw prefix argument as it was before this command; its value is negated to form the new prefix argument. Don’t call this command yourself unless you know what you are doing.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.13 Recursive Editing

The Emacs command loop is entered automatically when Emacs starts up. This top-level invocation of the command loop never exits; it keeps running as long as Emacs does. Lisp programs can also invoke the command loop. Since this makes more than one activation of the command loop, we call it recursive editing. A recursive editing level has the effect of suspending whatever command invoked it and permitting the user to do arbitrary editing before resuming that command.

The commands available during recursive editing are the same ones available in the top-level editing loop and defined in the keymaps. Only a few special commands exit the recursive editing level; the others return to the recursive editing level when they finish. (The special commands for exiting are always available, but they do nothing when recursive editing is not in progress.)

All command loops, including recursive ones, set up all-purpose error handlers so that an error in a command run from the command loop will not exit the loop.

Minibuffer input is a special kind of recursive editing. It has a few special wrinkles, such as enabling display of the minibuffer and the minibuffer window, but fewer than you might suppose. Certain keys behave differently in the minibuffer, but that is only because of the minibuffer’s local map; if you switch windows, you get the usual Emacs commands.

To invoke a recursive editing level, call the function recursive-edit. This function contains the command loop; it also contains a call to catch with tag exit, which makes it possible to exit the recursive editing level by throwing to exit (see section Explicit Nonlocal Exits: catch and throw). If you throw a value other than t, then recursive-edit returns normally to the function that called it. The command C-M-c (exit-recursive-edit) does this. Throwing a t value causes recursive-edit to quit, so that control returns to the command loop one level up. This is called aborting, and is done by C-] (abort-recursive-edit).

Most applications should not use recursive editing, except as part of using the minibuffer. Usually it is more convenient for the user if you change the major mode of the current buffer temporarily to a special major mode, which should have a command to go back to the previous mode. (The e command in Rmail uses this technique.) Or, if you wish to give the user different text to edit “recursively”, create and select a new buffer in a special mode. In this mode, define a command to complete the processing and go back to the previous buffer. (The m command in Rmail does this.)

Recursive edits are useful in debugging. You can insert a call to debug into a function definition as a sort of breakpoint, so that you can look around when the function gets there. debug invokes a recursive edit but also provides the other features of the debugger.

Recursive editing levels are also used when you type C-r in query-replace or use C-x q (kbd-macro-query).

Command: recursive-edit

This function invokes the editor command loop. It is called automatically by the initialization of Emacs, to let the user begin editing. When called from a Lisp program, it enters a recursive editing level.

If the current buffer is not the same as the selected window’s buffer, recursive-edit saves and restores the current buffer. Otherwise, if you switch buffers, the buffer you switched to is current after recursive-edit returns.

In the following example, the function simple-rec first advances point one word, then enters a recursive edit, printing out a message in the echo area. The user can then do any editing desired, and then type C-M-c to exit and continue executing simple-rec.

(defun simple-rec ()
  (forward-word 1)
  (message "Recursive edit in progress")
  (recursive-edit)
  (forward-word 1))
     ⇒ simple-rec
(simple-rec)
     ⇒ nil
Command: exit-recursive-edit

This function exits from the innermost recursive edit (including minibuffer input). Its definition is effectively (throw 'exit nil).

Command: abort-recursive-edit

This function aborts the command that requested the innermost recursive edit (including minibuffer input), by signaling quit after exiting the recursive edit. Its definition is effectively (throw 'exit t). See section Quitting.

Command: top-level

This function exits all recursive editing levels; it does not return a value, as it jumps completely out of any computation directly back to the main command loop.

Function: recursion-depth

This function returns the current depth of recursive edits. When no recursive edit is active, it returns 0.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.14 Disabling Commands

Disabling a command marks the command as requiring user confirmation before it can be executed. Disabling is used for commands which might be confusing to beginning users, to prevent them from using the commands by accident.

The low-level mechanism for disabling a command is to put a non-nil disabled property on the Lisp symbol for the command. These properties are normally set up by the user’s init file (see section The Init File) with Lisp expressions such as this:

(put 'upcase-region 'disabled t)

For a few commands, these properties are present by default (you can remove them in your init file if you wish).

If the value of the disabled property is a string, the message saying the command is disabled includes that string. For example:

(put 'delete-region 'disabled
     "Text deleted this way cannot be yanked back!\n")

See Disabling in The GNU Emacs Manual, for the details on what happens when a disabled command is invoked interactively. Disabling a command has no effect on calling it as a function from Lisp programs.

Command: enable-command command

Allow command (a symbol) to be executed without special confirmation from now on, and alter the user’s init file (see section The Init File) so that this will apply to future sessions.

Command: disable-command command

Require special confirmation to execute command from now on, and alter the user’s init file so that this will apply to future sessions.

Variable: disabled-command-function

The value of this variable should be a function. When the user invokes a disabled command interactively, this function is called instead of the disabled command. It can use this-command-keys to determine what the user typed to run the command, and thus find the command itself.

The value may also be nil. Then all commands work normally, even disabled ones.

By default, the value is a function that asks the user whether to proceed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.15 Command History

The command loop keeps a history of the complex commands that have been executed, to make it convenient to repeat these commands. A complex command is one for which the interactive argument reading uses the minibuffer. This includes any M-x command, any M-: command, and any command whose interactive specification reads an argument from the minibuffer. Explicit use of the minibuffer during the execution of the command itself does not cause the command to be considered complex.

Variable: command-history

This variable’s value is a list of recent complex commands, each represented as a form to evaluate. It continues to accumulate all complex commands for the duration of the editing session, but when it reaches the maximum size (see section Minibuffer History), the oldest elements are deleted as new ones are added.

command-history
⇒ ((switch-to-buffer "chistory.texi")
    (describe-key "^X^[")
    (visit-tags-table "~/emacs/src/")
    (find-tag "repeat-complex-command"))

This history list is actually a special case of minibuffer history (see section Minibuffer History), with one special twist: the elements are expressions rather than strings.

There are a number of commands devoted to the editing and recall of previous commands. The commands repeat-complex-command, and list-command-history are described in the user manual (see Repetition in The GNU Emacs Manual). Within the minibuffer, the usual minibuffer history commands are available.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.16 Keyboard Macros

A keyboard macro is a canned sequence of input events that can be considered a command and made the definition of a key. The Lisp representation of a keyboard macro is a string or vector containing the events. Don’t confuse keyboard macros with Lisp macros (see section Macros).

Function: execute-kbd-macro kbdmacro &optional count loopfunc

This function executes kbdmacro as a sequence of events. If kbdmacro is a string or vector, then the events in it are executed exactly as if they had been input by the user. The sequence is not expected to be a single key sequence; normally a keyboard macro definition consists of several key sequences concatenated.

If kbdmacro is a symbol, then its function definition is used in place of kbdmacro. If that is another symbol, this process repeats. Eventually the result should be a string or vector. If the result is not a symbol, string, or vector, an error is signaled.

The argument count is a repeat count; kbdmacro is executed that many times. If count is omitted or nil, kbdmacro is executed once. If it is 0, kbdmacro is executed over and over until it encounters an error or a failing search.

If loopfunc is non-nil, it is a function that is called, without arguments, prior to each iteration of the macro. If loopfunc returns nil, then this stops execution of the macro.

See section Reading One Event, for an example of using execute-kbd-macro.

Variable: executing-kbd-macro

This variable contains the string or vector that defines the keyboard macro that is currently executing. It is nil if no macro is currently executing. A command can test this variable so as to behave differently when run from an executing macro. Do not set this variable yourself.

Variable: defining-kbd-macro

This variable is non-nil if and only if a keyboard macro is being defined. A command can test this variable so as to behave differently while a macro is being defined. The value is append while appending to the definition of an existing macro. The commands start-kbd-macro, kmacro-start-macro and end-kbd-macro set this variable—do not set it yourself.

The variable is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals.

Variable: last-kbd-macro

This variable is the definition of the most recently defined keyboard macro. Its value is a string or vector, or nil.

The variable is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals.

Variable: kbd-macro-termination-hook

This normal hook is run when a keyboard macro terminates, regardless of what caused it to terminate (reaching the macro end or an error which ended the macro prematurely).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21 Keymaps

The command bindings of input events are recorded in data structures called keymaps. Each entry in a keymap associates (or binds) an individual event type, either to another keymap or to a command. When an event type is bound to a keymap, that keymap is used to look up the next input event; this continues until a command is found. The whole process is called key lookup.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.1 Key Sequences

A key sequence, or key for short, is a sequence of one or more input events that form a unit. Input events include characters, function keys, mouse actions, or system events external to Emacs, such as iconify-frame (see section Input Events). The Emacs Lisp representation for a key sequence is a string or vector. Unless otherwise stated, any Emacs Lisp function that accepts a key sequence as an argument can handle both representations.

In the string representation, alphanumeric characters ordinarily stand for themselves; for example, "a" represents a and "2" represents 2. Control character events are prefixed by the substring "\C-", and meta characters by "\M-"; for example, "\C-x" represents the key C-x. In addition, the TAB, RET, ESC, and DEL events are represented by "\t", "\r", "\e", and "\d" respectively. The string representation of a complete key sequence is the concatenation of the string representations of the constituent events; thus, "\C-xl" represents the key sequence C-x l.

Key sequences containing function keys, mouse button events, system events, or non-ASCII characters such as C-= or H-a cannot be represented as strings; they have to be represented as vectors.

In the vector representation, each element of the vector represents an input event, in its Lisp form. See section Input Events. For example, the vector [?\C-x ?l] represents the key sequence C-x l.

For examples of key sequences written in string and vector representations, Init Rebinding in The GNU Emacs Manual.

Function: kbd keyseq-text

This function converts the text keyseq-text (a string constant) into a key sequence (a string or vector constant). The contents of keyseq-text should use the same syntax as in the buffer invoked by the C-x C-k RET (kmacro-edit-macro) command; in particular, you must surround function key names with ‘<…>’. See Edit Keyboard Macro in The GNU Emacs Manual.

(kbd "C-x") ⇒ "\C-x"
(kbd "C-x C-f") ⇒ "\C-x\C-f"
(kbd "C-x 4 C-f") ⇒ "\C-x4\C-f"
(kbd "X") ⇒ "X"
(kbd "RET") ⇒ "\^M"
(kbd "C-c SPC") ⇒ "\C-c "
(kbd "<f1> SPC") ⇒ [f1 32]
(kbd "C-M-<down>") ⇒ [C-M-down]

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.2 Keymap Basics

A keymap is a Lisp data structure that specifies key bindings for various key sequences.

A single keymap directly specifies definitions for individual events. When a key sequence consists of a single event, its binding in a keymap is the keymap’s definition for that event. The binding of a longer key sequence is found by an iterative process: first find the definition of the first event (which must itself be a keymap); then find the second event’s definition in that keymap, and so on until all the events in the key sequence have been processed.

If the binding of a key sequence is a keymap, we call the key sequence a prefix key. Otherwise, we call it a complete key (because no more events can be added to it). If the binding is nil, we call the key undefined. Examples of prefix keys are C-c, C-x, and C-x 4. Examples of defined complete keys are X, RET, and C-x 4 C-f. Examples of undefined complete keys are C-x C-g, and C-c 3. See section Prefix Keys, for more details.

The rule for finding the binding of a key sequence assumes that the intermediate bindings (found for the events before the last) are all keymaps; if this is not so, the sequence of events does not form a unit—it is not really one key sequence. In other words, removing one or more events from the end of any valid key sequence must always yield a prefix key. For example, C-f C-n is not a key sequence; C-f is not a prefix key, so a longer sequence starting with C-f cannot be a key sequence.

The set of possible multi-event key sequences depends on the bindings for prefix keys; therefore, it can be different for different keymaps, and can change when bindings are changed. However, a one-event sequence is always a key sequence, because it does not depend on any prefix keys for its well-formedness.

At any time, several primary keymaps are active—that is, in use for finding key bindings. These are the global map, which is shared by all buffers; the local keymap, which is usually associated with a specific major mode; and zero or more minor mode keymaps, which belong to currently enabled minor modes. (Not all minor modes have keymaps.) The local keymap bindings shadow (i.e., take precedence over) the corresponding global bindings. The minor mode keymaps shadow both local and global keymaps. See section Active Keymaps, for details.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.3 Format of Keymaps

Each keymap is a list whose CAR is the symbol keymap. The remaining elements of the list define the key bindings of the keymap. A symbol whose function definition is a keymap is also a keymap. Use the function keymapp (see below) to test whether an object is a keymap.

Several kinds of elements may appear in a keymap, after the symbol keymap that begins it:

(type . binding)

This specifies one binding, for events of type type. Each ordinary binding applies to events of a particular event type, which is always a character or a symbol. See section Classifying Events. In this kind of binding, binding is a command.

(type item-name . binding)

This specifies a binding which is also a simple menu item that displays as item-name in the menu. See section Simple Menu Items.

(type item-name help-string . binding)

This is a simple menu item with help string help-string.

(type menu-item . details)

This specifies a binding which is also an extended menu item. This allows use of other features. See section Extended Menu Items.

(t . binding)

This specifies a default key binding; any event not bound by other elements of the keymap is given binding as its binding. Default bindings allow a keymap to bind all possible event types without having to enumerate all of them. A keymap that has a default binding completely masks any lower-precedence keymap, except for events explicitly bound to nil (see below).

char-table

If an element of a keymap is a char-table, it counts as holding bindings for all character events with no modifier bits (see modifier bits): element n is the binding for the character with code n. This is a compact way to record lots of bindings. A keymap with such a char-table is called a full keymap. Other keymaps are called sparse keymaps.

string

Aside from elements that specify bindings for keys, a keymap can also have a string as an element. This is called the overall prompt string and makes it possible to use the keymap as a menu. See section Defining Menus.

(keymap …)

If an element of a keymap is itself a keymap, it counts as if this inner keymap were inlined in the outer keymap. This is used for multiple-inheritance, such as in make-composed-keymap.

When the binding is nil, it doesn’t constitute a definition but it does take precedence over a default binding or a binding in the parent keymap. On the other hand, a binding of nil does not override lower-precedence keymaps; thus, if the local map gives a binding of nil, Emacs uses the binding from the global map.

Keymaps do not directly record bindings for the meta characters. Instead, meta characters are regarded for purposes of key lookup as sequences of two characters, the first of which is ESC (or whatever is currently the value of meta-prefix-char). Thus, the key M-a is internally represented as ESC a, and its global binding is found at the slot for a in esc-map (see section Prefix Keys).

This conversion applies only to characters, not to function keys or other input events; thus, M-end has nothing to do with ESC end.

Here as an example is the local keymap for Lisp mode, a sparse keymap. It defines bindings for DEL, C-c C-z, C-M-q, and C-M-x (the actual value also contains a menu binding, which is omitted here for the sake of brevity).

lisp-mode-map
⇒
(keymap
 (3 keymap
    ;; C-c C-z
    (26 . run-lisp))
 (27 keymap
     ;; C-M-x, treated as ESC C-x
     (24 . lisp-send-defun))
 ;; This part is inherited from lisp-mode-shared-map.
 keymap
 ;; DEL
 (127 . backward-delete-char-untabify)
 (27 keymap
     ;; C-M-q, treated as ESC C-q
     (17 . indent-sexp)))
Function: keymapp object

This function returns t if object is a keymap, nil otherwise. More precisely, this function tests for a list whose CAR is keymap, or for a symbol whose function definition satisfies keymapp.

(keymapp '(keymap))
    ⇒ t
(fset 'foo '(keymap))
(keymapp 'foo)
    ⇒ t
(keymapp (current-global-map))
    ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.4 Creating Keymaps

Here we describe the functions for creating keymaps.

Function: make-sparse-keymap &optional prompt

This function creates and returns a new sparse keymap with no entries. (A sparse keymap is the kind of keymap you usually want.) The new keymap does not contain a char-table, unlike make-keymap, and does not bind any events.

(make-sparse-keymap)
    ⇒ (keymap)

If you specify prompt, that becomes the overall prompt string for the keymap. You should specify this only for menu keymaps (see section Defining Menus). A keymap with an overall prompt string will always present a mouse menu or a keyboard menu if it is active for looking up the next input event. Don’t specify an overall prompt string for the main map of a major or minor mode, because that would cause the command loop to present a keyboard menu every time.

Function: make-keymap &optional prompt

This function creates and returns a new full keymap. That keymap contains a char-table (see section Char-Tables) with slots for all characters without modifiers. The new keymap initially binds all these characters to nil, and does not bind any other kind of event. The argument prompt specifies a prompt string, as in make-sparse-keymap.

(make-keymap)
    ⇒ (keymap #^[nil nil keymap nil nil nil …])

A full keymap is more efficient than a sparse keymap when it holds lots of bindings; for just a few, the sparse keymap is better.

Function: copy-keymap keymap

This function returns a copy of keymap. Any keymaps that appear directly as bindings in keymap are also copied recursively, and so on to any number of levels. However, recursive copying does not take place when the definition of a character is a symbol whose function definition is a keymap; the same symbol appears in the new copy.

(setq map (copy-keymap (current-local-map)))
⇒ (keymap
     ;; (This implements meta characters.)
     (27 keymap
         (83 . center-paragraph)
         (115 . center-line))
     (9 . tab-to-tab-stop))
(eq map (current-local-map))
    ⇒ nil
(equal map (current-local-map))
    ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.5 Inheritance and Keymaps

A keymap can inherit the bindings of another keymap, which we call the parent keymap. Such a keymap looks like this:

(keymap elements… . parent-keymap)

The effect is that this keymap inherits all the bindings of parent-keymap, whatever they may be at the time a key is looked up, but can add to them or override them with elements.

If you change the bindings in parent-keymap using define-key or other key-binding functions, these changed bindings are visible in the inheriting keymap, unless shadowed by the bindings made by elements. The converse is not true: if you use define-key to change bindings in the inheriting keymap, these changes are recorded in elements, but have no effect on parent-keymap.

The proper way to construct a keymap with a parent is to use set-keymap-parent; if you have code that directly constructs a keymap with a parent, please convert the program to use set-keymap-parent instead.

Function: keymap-parent keymap

This returns the parent keymap of keymap. If keymap has no parent, keymap-parent returns nil.

Function: set-keymap-parent keymap parent

This sets the parent keymap of keymap to parent, and returns parent. If parent is nil, this function gives keymap no parent at all.

If keymap has submaps (bindings for prefix keys), they too receive new parent keymaps that reflect what parent specifies for those prefix keys.

Here is an example showing how to make a keymap that inherits from text-mode-map:

(let ((map (make-sparse-keymap)))
  (set-keymap-parent map text-mode-map)
  map)

A non-sparse keymap can have a parent too, but this is not very useful. A non-sparse keymap always specifies something as the binding for every numeric character code without modifier bits, even if it is nil, so these character’s bindings are never inherited from the parent keymap.

Sometimes you want to make a keymap that inherits from more than one map. You can use the function make-composed-keymap for this.

Function: make-composed-keymap maps &optional parent

This function returns a new keymap composed of the existing keymap(s) maps, and optionally inheriting from a parent keymap parent. maps can be a single keymap or a list of more than one. When looking up a key in the resulting new map, Emacs searches in each of the maps in turn, and then in parent, stopping at the first match. A nil binding in any one of maps overrides any binding in parent, but it does not override any non-nil binding in any other of the maps.

For example, here is how Emacs sets the parent of help-mode-map, such that it inherits from both button-buffer-map and special-mode-map:

(defvar help-mode-map
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map
      (make-composed-keymap button-buffer-map special-mode-map))
    ... map) ... )

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.6 Prefix Keys

A prefix key is a key sequence whose binding is a keymap. The keymap defines what to do with key sequences that extend the prefix key. For example, C-x is a prefix key, and it uses a keymap that is also stored in the variable ctl-x-map. This keymap defines bindings for key sequences starting with C-x.

Some of the standard Emacs prefix keys use keymaps that are also found in Lisp variables:

The keymap binding of a prefix key is used for looking up the event that follows the prefix key. (It may instead be a symbol whose function definition is a keymap. The effect is the same, but the symbol serves as a name for the prefix key.) Thus, the binding of C-x is the symbol Control-X-prefix, whose function cell holds the keymap for C-x commands. (The same keymap is also the value of ctl-x-map.)

Prefix key definitions can appear in any active keymap. The definitions of C-c, C-x, C-h and ESC as prefix keys appear in the global map, so these prefix keys are always available. Major and minor modes can redefine a key as a prefix by putting a prefix key definition for it in the local map or the minor mode’s map. See section Active Keymaps.

If a key is defined as a prefix in more than one active map, then its various definitions are in effect merged: the commands defined in the minor mode keymaps come first, followed by those in the local map’s prefix definition, and then by those from the global map.

In the following example, we make C-p a prefix key in the local keymap, in such a way that C-p is identical to C-x. Then the binding for C-p C-f is the function find-file, just like C-x C-f. The key sequence C-p 6 is not found in any active keymap.

(use-local-map (make-sparse-keymap))
    ⇒ nil
(local-set-key "\C-p" ctl-x-map)
    ⇒ nil
(key-binding "\C-p\C-f")
    ⇒ find-file
(key-binding "\C-p6")
    ⇒ nil
Function: define-prefix-command symbol &optional mapvar prompt

This function prepares symbol for use as a prefix key’s binding: it creates a sparse keymap and stores it as symbol’s function definition. Subsequently binding a key sequence to symbol will make that key sequence into a prefix key. The return value is symbol.

This function also sets symbol as a variable, with the keymap as its value. But if mapvar is non-nil, it sets mapvar as a variable instead.

If prompt is non-nil, that becomes the overall prompt string for the keymap. The prompt string should be given for menu keymaps (see section Defining Menus).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.7 Active Keymaps

Emacs contains many keymaps, but at any time only a few keymaps are active. When Emacs receives user input, it translates the input event (see section Keymaps for Translating Sequences of Events), and looks for a key binding in the active keymaps.

Usually, the active keymaps are: (i) the keymap specified by the keymap property, (ii) the keymaps of enabled minor modes, (iii) the current buffer’s local keymap, and (iv) the global keymap, in that order. Emacs searches for each input key sequence in all these keymaps.

Of these “usual” keymaps, the highest-precedence one is specified by the keymap text or overlay property at point, if any. (For a mouse input event, Emacs uses the event position instead of point; see section Searching the Active Keymaps.)

Next in precedence are keymaps specified by enabled minor modes. These keymaps, if any, are specified by the variables emulation-mode-map-alists, minor-mode-overriding-map-alist, and minor-mode-map-alist. See section Controlling the Active Keymaps.

Next in precedence is the buffer’s local keymap, containing key bindings specific to the buffer. The minibuffer also has a local keymap (see section Introduction to Minibuffers). If there is a local-map text or overlay property at point, that specifies the local keymap to use, in place of the buffer’s default local keymap.

The local keymap is normally set by the buffer’s major mode, and every buffer with the same major mode shares the same local keymap. Hence, if you call local-set-key (see section Commands for Binding Keys) to change the local keymap in one buffer, that also affects the local keymaps in other buffers with the same major mode.

Finally, the global keymap contains key bindings that are defined regardless of the current buffer, such as C-f. It is always active, and is bound to the variable global-map.

Apart from the above “usual” keymaps, Emacs provides special ways for programs to make other keymaps active. Firstly, the variable overriding-local-map specifies a keymap that replaces the usual active keymaps, except for the global keymap. Secondly, the terminal-local variable overriding-terminal-local-map specifies a keymap that takes precedence over all other keymaps (including overriding-local-map); this is normally used for modal/transient keybindings (the function set-transient-map provides a convenient interface for this). See section Controlling the Active Keymaps, for details.

Making keymaps active is not the only way to use them. Keymaps are also used in other ways, such as for translating events within read-key-sequence. See section Keymaps for Translating Sequences of Events.

See section Standard Keymaps, for a list of some standard keymaps.

Function: current-active-maps &optional olp position

This returns the list of active keymaps that would be used by the command loop in the current circumstances to look up a key sequence. Normally it ignores overriding-local-map and overriding-terminal-local-map, but if olp is non-nil then it pays attention to them. position can optionally be either an event position as returned by event-start or a buffer position, and may change the keymaps as described for key-binding.

Function: key-binding key &optional accept-defaults no-remap position

This function returns the binding for key according to the current active keymaps. The result is nil if key is undefined in the keymaps.

The argument accept-defaults controls checking for default bindings, as in lookup-key (see section Functions for Key Lookup).

When commands are remapped (see section Remapping Commands), key-binding normally processes command remappings so as to return the remapped command that will actually be executed. However, if no-remap is non-nil, key-binding ignores remappings and returns the binding directly specified for key.

If key starts with a mouse event (perhaps following a prefix event), the maps to be consulted are determined based on the event’s position. Otherwise, they are determined based on the value of point. However, you can override either of them by specifying position. If position is non-nil, it should be either a buffer position or an event position like the value of event-start. Then the maps consulted are determined based on position.

Emacs signals an error if key is not a string or a vector.

(key-binding "\C-x\C-f")
    ⇒ find-file

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.8 Searching the Active Keymaps

Here is a pseudo-Lisp summary of how Emacs searches the active keymaps:

(or (if overriding-terminal-local-map
        (find-in overriding-terminal-local-map))
    (if overriding-local-map
        (find-in overriding-local-map)
      (or (find-in (get-char-property (point) 'keymap))
          (find-in-any emulation-mode-map-alists)
          (find-in-any minor-mode-overriding-map-alist)
          (find-in-any minor-mode-map-alist)
          (if (get-text-property (point) 'local-map)
              (find-in (get-char-property (point) 'local-map))
            (find-in (current-local-map)))))
    (find-in (current-global-map)))

Here, find-in and find-in-any are pseudo functions that search in one keymap and in an alist of keymaps, respectively. Note that the set-transient-map function works by setting overriding-terminal-local-map (see section Controlling the Active Keymaps).

In the above pseudo-code, if a key sequence starts with a mouse event (see section Mouse Events), that event’s position is used instead of point, and the event’s buffer is used instead of the current buffer. In particular, this affects how the keymap and local-map properties are looked up. If a mouse event occurs on a string embedded with a display, before-string, or after-string property (see section Properties with Special Meanings), and the string has a non-nil keymap or local-map property, that overrides the corresponding property in the underlying buffer text (i.e., the property specified by the underlying text is ignored).

When a key binding is found in one of the active keymaps, and that binding is a command, the search is over—the command is executed. However, if the binding is a symbol with a value or a string, Emacs replaces the input key sequences with the variable’s value or the string, and restarts the search of the active keymaps. See section Key Lookup.

The command which is finally found might also be remapped. See section Remapping Commands.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.9 Controlling the Active Keymaps

Variable: global-map

This variable contains the default global keymap that maps Emacs keyboard input to commands. The global keymap is normally this keymap. The default global keymap is a full keymap that binds self-insert-command to all of the printing characters.

It is normal practice to change the bindings in the global keymap, but you should not assign this variable any value other than the keymap it starts out with.

Function: current-global-map

This function returns the current global keymap. This is the same as the value of global-map unless you change one or the other. The return value is a reference, not a copy; if you use define-key or other functions on it you will alter global bindings.

(current-global-map)
⇒ (keymap [set-mark-command beginning-of-line …
            delete-backward-char])
Function: current-local-map

This function returns the current buffer’s local keymap, or nil if it has none. In the following example, the keymap for the *scratch* buffer (using Lisp Interaction mode) is a sparse keymap in which the entry for ESC, ASCII code 27, is another sparse keymap.

(current-local-map)
⇒ (keymap
    (10 . eval-print-last-sexp)
    (9 . lisp-indent-line)
    (127 . backward-delete-char-untabify)
    (27 keymap
        (24 . eval-defun)
        (17 . indent-sexp)))

current-local-map returns a reference to the local keymap, not a copy of it; if you use define-key or other functions on it you will alter local bindings.

Function: current-minor-mode-maps

This function returns a list of the keymaps of currently enabled minor modes.

Function: use-global-map keymap

This function makes keymap the new current global keymap. It returns nil.

It is very unusual to change the global keymap.

Function: use-local-map keymap

This function makes keymap the new local keymap of the current buffer. If keymap is nil, then the buffer has no local keymap. use-local-map returns nil. Most major mode commands use this function.

Variable: minor-mode-map-alist

This variable is an alist describing keymaps that may or may not be active according to the values of certain variables. Its elements look like this:

(variable . keymap)

The keymap keymap is active whenever variable has a non-nil value. Typically variable is the variable that enables or disables a minor mode. See section Keymaps and Minor Modes.

Note that elements of minor-mode-map-alist do not have the same structure as elements of minor-mode-alist. The map must be the CDR of the element; a list with the map as the second element will not do. The CDR can be either a keymap (a list) or a symbol whose function definition is a keymap.

When more than one minor mode keymap is active, the earlier one in minor-mode-map-alist takes priority. But you should design minor modes so that they don’t interfere with each other. If you do this properly, the order will not matter.

See Keymaps and Minor Modes, for more information about minor modes. See also minor-mode-key-binding (see section Functions for Key Lookup).

Variable: minor-mode-overriding-map-alist

This variable allows major modes to override the key bindings for particular minor modes. The elements of this alist look like the elements of minor-mode-map-alist: (variable . keymap).

If a variable appears as an element of minor-mode-overriding-map-alist, the map specified by that element totally replaces any map specified for the same variable in minor-mode-map-alist.

minor-mode-overriding-map-alist is automatically buffer-local in all buffers.

Variable: overriding-local-map

If non-nil, this variable holds a keymap to use instead of the buffer’s local keymap, any text property or overlay keymaps, and any minor mode keymaps. This keymap, if specified, overrides all other maps that would have been active, except for the current global map.

Variable: overriding-terminal-local-map

If non-nil, this variable holds a keymap to use instead of overriding-local-map, the buffer’s local keymap, text property or overlay keymaps, and all the minor mode keymaps.

This variable is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals. It is used to implement incremental search mode.

Variable: overriding-local-map-menu-flag

If this variable is non-nil, the value of overriding-local-map or overriding-terminal-local-map can affect the display of the menu bar. The default value is nil, so those map variables have no effect on the menu bar.

Note that these two map variables do affect the execution of key sequences entered using the menu bar, even if they do not affect the menu bar display. So if a menu bar key sequence comes in, you should clear the variables before looking up and executing that key sequence. Modes that use the variables would typically do this anyway; normally they respond to events that they do not handle by “unreading” them and exiting.

Variable: special-event-map

This variable holds a keymap for special events. If an event type has a binding in this keymap, then it is special, and the binding for the event is run directly by read-event. See section Special Events.

Variable: emulation-mode-map-alists

This variable holds a list of keymap alists to use for emulation modes. It is intended for modes or packages using multiple minor-mode keymaps. Each element is a keymap alist which has the same format and meaning as minor-mode-map-alist, or a symbol with a variable binding which is such an alist. The “active” keymaps in each alist are used before minor-mode-map-alist and minor-mode-overriding-map-alist.

Function: set-transient-map keymap &optional keep

This function adds keymap as a transient keymap, which takes precedence over other keymaps for one (or more) subsequent keys.

Normally, keymap is used just once, to look up the very next key. If the optional argument pred is t, the map stays active as long as the user types keys defined in keymap; when the user types a key that is not in keymap, the transient keymap is deactivated and normal key lookup continues for that key.

The pred argument can also be a function. In that case, the function is called with no arguments, prior to running each command, while keymap is active; it should return non-nil if keymap should stay active.

This function works by adding and removing keymap from the variable overriding-terminal-local-map, which takes precedence over all other active keymaps (see section Searching the Active Keymaps).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.10 Key Lookup

Key lookup is the process of finding the binding of a key sequence from a given keymap. The execution or use of the binding is not part of key lookup.

Key lookup uses just the event type of each event in the key sequence; the rest of the event is ignored. In fact, a key sequence used for key lookup may designate a mouse event with just its types (a symbol) instead of the entire event (a list). See section Input Events. Such a “key sequence” is insufficient for command-execute to run, but it is sufficient for looking up or rebinding a key.

When the key sequence consists of multiple events, key lookup processes the events sequentially: the binding of the first event is found, and must be a keymap; then the second event’s binding is found in that keymap, and so on until all the events in the key sequence are used up. (The binding thus found for the last event may or may not be a keymap.) Thus, the process of key lookup is defined in terms of a simpler process for looking up a single event in a keymap. How that is done depends on the type of object associated with the event in that keymap.

Let’s use the term keymap entry to describe the value found by looking up an event type in a keymap. (This doesn’t include the item string and other extra elements in a keymap element for a menu item, because lookup-key and other key lookup functions don’t include them in the returned value.) While any Lisp object may be stored in a keymap as a keymap entry, not all make sense for key lookup. Here is a table of the meaningful types of keymap entries:

nil

nil means that the events used so far in the lookup form an undefined key. When a keymap fails to mention an event type at all, and has no default binding, that is equivalent to a binding of nil for that event type.

command

The events used so far in the lookup form a complete key, and command is its binding. See section What Is a Function?.

array

The array (either a string or a vector) is a keyboard macro. The events used so far in the lookup form a complete key, and the array is its binding. See Keyboard Macros, for more information.

keymap

The events used so far in the lookup form a prefix key. The next event of the key sequence is looked up in keymap.

list

The meaning of a list depends on what it contains:

symbol

The function definition of symbol is used in place of symbol. If that too is a symbol, then this process is repeated, any number of times. Ultimately this should lead to an object that is a keymap, a command, or a keyboard macro. A list is allowed if it is a keymap or a command, but indirect entries are not understood when found via symbols.

Note that keymaps and keyboard macros (strings and vectors) are not valid functions, so a symbol with a keymap, string, or vector as its function definition is invalid as a function. It is, however, valid as a key binding. If the definition is a keyboard macro, then the symbol is also valid as an argument to command-execute (see section Interactive Call).

The symbol undefined is worth special mention: it means to treat the key as undefined. Strictly speaking, the key is defined, and its binding is the command undefined; but that command does the same thing that is done automatically for an undefined key: it rings the bell (by calling ding) but does not signal an error.

undefined is used in local keymaps to override a global key binding and make the key “undefined” locally. A local binding of nil would fail to do this because it would not override the global binding.

anything else

If any other type of object is found, the events used so far in the lookup form a complete key, and the object is its binding, but the binding is not executable as a command.

In short, a keymap entry may be a keymap, a command, a keyboard macro, a symbol that leads to one of them, or an indirection or nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.11 Functions for Key Lookup

Here are the functions and variables pertaining to key lookup.

Function: lookup-key keymap key &optional accept-defaults

This function returns the definition of key in keymap. All the other functions described in this chapter that look up keys use lookup-key. Here are examples:

(lookup-key (current-global-map) "\C-x\C-f")
    ⇒ find-file
(lookup-key (current-global-map) (kbd "C-x C-f"))
    ⇒ find-file
(lookup-key (current-global-map) "\C-x\C-f12345")
    ⇒ 2

If the string or vector key is not a valid key sequence according to the prefix keys specified in keymap, it must be “too long” and have extra events at the end that do not fit into a single key sequence. Then the value is a number, the number of events at the front of key that compose a complete key.

If accept-defaults is non-nil, then lookup-key considers default bindings as well as bindings for the specific events in key. Otherwise, lookup-key reports only bindings for the specific sequence key, ignoring default bindings except when you explicitly ask about them. (To do this, supply t as an element of key; see Format of Keymaps.)

If key contains a meta character (not a function key), that character is implicitly replaced by a two-character sequence: the value of meta-prefix-char, followed by the corresponding non-meta character. Thus, the first example below is handled by conversion into the second example.

(lookup-key (current-global-map) "\M-f")
    ⇒ forward-word
(lookup-key (current-global-map) "\ef")
    ⇒ forward-word

Unlike read-key-sequence, this function does not modify the specified events in ways that discard information (see section Key Sequence Input). In particular, it does not convert letters to lower case and it does not change drag events to clicks.

Command: undefined

Used in keymaps to undefine keys. It calls ding, but does not cause an error.

Function: local-key-binding key &optional accept-defaults

This function returns the binding for key in the current local keymap, or nil if it is undefined there.

The argument accept-defaults controls checking for default bindings, as in lookup-key (above).

Function: global-key-binding key &optional accept-defaults

This function returns the binding for command key in the current global keymap, or nil if it is undefined there.

The argument accept-defaults controls checking for default bindings, as in lookup-key (above).

Function: minor-mode-key-binding key &optional accept-defaults

This function returns a list of all the active minor mode bindings of key. More precisely, it returns an alist of pairs (modename . binding), where modename is the variable that enables the minor mode, and binding is key’s binding in that mode. If key has no minor-mode bindings, the value is nil.

If the first binding found is not a prefix definition (a keymap or a symbol defined as a keymap), all subsequent bindings from other minor modes are omitted, since they would be completely shadowed. Similarly, the list omits non-prefix bindings that follow prefix bindings.

The argument accept-defaults controls checking for default bindings, as in lookup-key (above).

User Option: meta-prefix-char

This variable is the meta-prefix character code. It is used for translating a meta character to a two-character sequence so it can be looked up in a keymap. For useful results, the value should be a prefix event (see section Prefix Keys). The default value is 27, which is the ASCII code for ESC.

As long as the value of meta-prefix-char remains 27, key lookup translates M-b into ESC b, which is normally defined as the backward-word command. However, if you were to set meta-prefix-char to 24, the code for C-x, then Emacs will translate M-b into C-x b, whose standard binding is the switch-to-buffer command. (Don’t actually do this!) Here is an illustration of what would happen:

meta-prefix-char                    ; The default value.
     ⇒ 27
(key-binding "\M-b")
     ⇒ backward-word
?\C-x                               ; The print representation
     ⇒ 24                          ;   of a character.
(setq meta-prefix-char 24)
     ⇒ 24
(key-binding "\M-b")
     ⇒ switch-to-buffer            ; Now, typing M-b is
                                    ;   like typing C-x b.

(setq meta-prefix-char 27)          ; Avoid confusion!
     ⇒ 27                          ; Restore the default value!

This translation of one event into two happens only for characters, not for other kinds of input events. Thus, M-F1, a function key, is not converted into ESC F1.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.12 Changing Key Bindings

The way to rebind a key is to change its entry in a keymap. If you change a binding in the global keymap, the change is effective in all buffers (though it has no direct effect in buffers that shadow the global binding with a local one). If you change the current buffer’s local map, that usually affects all buffers using the same major mode. The global-set-key and local-set-key functions are convenient interfaces for these operations (see section Commands for Binding Keys). You can also use define-key, a more general function; then you must explicitly specify the map to change.

When choosing the key sequences for Lisp programs to rebind, please follow the Emacs conventions for use of various keys (see section Key Binding Conventions).

In writing the key sequence to rebind, it is good to use the special escape sequences for control and meta characters (see section String Type). The syntax ‘\C-’ means that the following character is a control character and ‘\M-’ means that the following character is a meta character. Thus, the string "\M-x" is read as containing a single M-x, "\C-f" is read as containing a single C-f, and "\M-\C-x" and "\C-\M-x" are both read as containing a single C-M-x. You can also use this escape syntax in vectors, as well as others that aren’t allowed in strings; one example is ‘[?\C-\H-x home]’. See section Character Type.

The key definition and lookup functions accept an alternate syntax for event types in a key sequence that is a vector: you can use a list containing modifier names plus one base event (a character or function key name). For example, (control ?a) is equivalent to ?\C-a and (hyper control left) is equivalent to C-H-left. One advantage of such lists is that the precise numeric codes for the modifier bits don’t appear in compiled files.

The functions below signal an error if keymap is not a keymap, or if key is not a string or vector representing a key sequence. You can use event types (symbols) as shorthand for events that are lists. The kbd function (see section Key Sequences) is a convenient way to specify the key sequence.

Function: define-key keymap key binding

This function sets the binding for key in keymap. (If key is more than one event long, the change is actually made in another keymap reached from keymap.) The argument binding can be any Lisp object, but only certain types are meaningful. (For a list of meaningful types, see Key Lookup.) The value returned by define-key is binding.

If key is [t], this sets the default binding in keymap. When an event has no binding of its own, the Emacs command loop uses the keymap’s default binding, if there is one.

Every prefix of key must be a prefix key (i.e., bound to a keymap) or undefined; otherwise an error is signaled. If some prefix of key is undefined, then define-key defines it as a prefix key so that the rest of key can be defined as specified.

If there was previously no binding for key in keymap, the new binding is added at the beginning of keymap. The order of bindings in a keymap makes no difference for keyboard input, but it does matter for menu keymaps (see section Menu Keymaps).

This example creates a sparse keymap and makes a number of bindings in it:

(setq map (make-sparse-keymap))
    ⇒ (keymap)
(define-key map "\C-f" 'forward-char)
    ⇒ forward-char
map
    ⇒ (keymap (6 . forward-char))
;; Build sparse submap for C-x and bind f in that.
(define-key map (kbd "C-x f") 'forward-word)
    ⇒ forward-word
map
⇒ (keymap
    (24 keymap                ; C-x
        (102 . forward-word)) ;      f
    (6 . forward-char))       ; C-f
;; Bind C-p to the ctl-x-map.
(define-key map (kbd "C-p") ctl-x-map)
;; ctl-x-map
⇒ [nil … find-file … backward-kill-sentence]
;; Bind C-f to foo in the ctl-x-map.
(define-key map (kbd "C-p C-f") 'foo)
⇒ 'foo
map
⇒ (keymap     ; Note foo in ctl-x-map.
    (16 keymap [nil … foo … backward-kill-sentence])
    (24 keymap
        (102 . forward-word))
    (6 . forward-char))

Note that storing a new binding for C-p C-f actually works by changing an entry in ctl-x-map, and this has the effect of changing the bindings of both C-p C-f and C-x C-f in the default global map.

The function substitute-key-definition scans a keymap for keys that have a certain binding and rebinds them with a different binding. Another feature which is cleaner and can often produce the same results to remap one command into another (see section Remapping Commands).

Function: substitute-key-definition olddef newdef keymap &optional oldmap

This function replaces olddef with newdef for any keys in keymap that were bound to olddef. In other words, olddef is replaced with newdef wherever it appears. The function returns nil.

For example, this redefines C-x C-f, if you do it in an Emacs with standard bindings:

(substitute-key-definition
 'find-file 'find-file-read-only (current-global-map))

If oldmap is non-nil, that changes the behavior of substitute-key-definition: the bindings in oldmap determine which keys to rebind. The rebindings still happen in keymap, not in oldmap. Thus, you can change one map under the control of the bindings in another. For example,

(substitute-key-definition
  'delete-backward-char 'my-funny-delete
  my-map global-map)

puts the special deletion command in my-map for whichever keys are globally bound to the standard deletion command.

Here is an example showing a keymap before and after substitution:

(setq map '(keymap
            (?1 . olddef-1)
            (?2 . olddef-2)
            (?3 . olddef-1)))
⇒ (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1))
(substitute-key-definition 'olddef-1 'newdef map)
⇒ nil
map
⇒ (keymap (49 . newdef) (50 . olddef-2) (51 . newdef))
Function: suppress-keymap keymap &optional nodigits

This function changes the contents of the full keymap keymap by remapping self-insert-command to the command undefined (see section Remapping Commands). This has the effect of undefining all printing characters, thus making ordinary insertion of text impossible. suppress-keymap returns nil.

If nodigits is nil, then suppress-keymap defines digits to run digit-argument, and - to run negative-argument. Otherwise it makes them undefined like the rest of the printing characters.

The suppress-keymap function does not make it impossible to modify a buffer, as it does not suppress commands such as yank and quoted-insert. To prevent any modification of a buffer, make it read-only (see section Read-Only Buffers).

Since this function modifies keymap, you would normally use it on a newly created keymap. Operating on an existing keymap that is used for some other purpose is likely to cause trouble; for example, suppressing global-map would make it impossible to use most of Emacs.

This function can be used to initialize the local keymap of a major mode for which insertion of text is not desirable. But usually such a mode should be derived from special-mode (see section Basic Major Modes); then its keymap will automatically inherit from special-mode-map, which is already suppressed. Here is how special-mode-map is defined:

(defvar special-mode-map
  (let ((map (make-sparse-keymap)))
    (suppress-keymap map)
    (define-key map "q" 'quit-window)
    …
    map))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.13 Remapping Commands

A special kind of key binding can be used to remap one command to another, without having to refer to the key sequence(s) bound to the original command. To use this feature, make a key binding for a key sequence that starts with the dummy event remap, followed by the command name you want to remap; for the binding, specify the new definition (usually a command name, but possibly any other valid definition for a key binding).

For example, suppose My mode provides a special command my-kill-line, which should be invoked instead of kill-line. To establish this, its mode keymap should contain the following remapping:

(define-key my-mode-map [remap kill-line] 'my-kill-line)

Then, whenever my-mode-map is active, if the user types C-k (the default global key sequence for kill-line) Emacs will instead run my-kill-line.

Note that remapping only takes place through active keymaps; for example, putting a remapping in a prefix keymap like ctl-x-map typically has no effect, as such keymaps are not themselves active. In addition, remapping only works through a single level; in the following example,

(define-key my-mode-map [remap kill-line] 'my-kill-line)
(define-key my-mode-map [remap my-kill-line] 'my-other-kill-line)

kill-line is not remapped to my-other-kill-line. Instead, if an ordinary key binding specifies kill-line, it is remapped to my-kill-line; if an ordinary binding specifies my-kill-line, it is remapped to my-other-kill-line.

To undo the remapping of a command, remap it to nil; e.g.,

(define-key my-mode-map [remap kill-line] nil)
Function: command-remapping command &optional position keymaps

This function returns the remapping for command (a symbol), given the current active keymaps. If command is not remapped (which is the usual situation), or not a symbol, the function returns nil. position can optionally specify a buffer position or an event position to determine the keymaps to use, as in key-binding.

If the optional argument keymaps is non-nil, it specifies a list of keymaps to search in. This argument is ignored if position is non-nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.14 Keymaps for Translating Sequences of Events

When the read-key-sequence function reads a key sequence (see section Key Sequence Input), it uses translation keymaps to translate certain event sequences into others. The translation keymaps are input-decode-map, local-function-key-map, and key-translation-map (in order of priority).

Translation keymaps have the same structure as other keymaps, but are used differently: they specify translations to make while reading key sequences, rather than bindings for complete key sequences. As each key sequence is read, it is checked against each translation keymap. If one of the translation keymaps “binds” k to a vector v, then whenever k appears as a sub-sequence anywhere in a key sequence, that sub-sequence is replaced with the events in v.

For example, VT100 terminals send ESC O P when the keypad key PF1 is pressed. On such terminals, Emacs must translate that sequence of events into a single event pf1. This is done by “binding” ESC O P to [pf1] in input-decode-map. Thus, when you type C-c PF1 on the terminal, the terminal emits the character sequence C-c ESC O P, and read-key-sequence translates this back into C-c PF1 and returns it as the vector [?\C-c pf1].

Translation keymaps take effect only after Emacs has decoded the keyboard input (via the input coding system specified by keyboard-coding-system). See section Terminal I/O Encoding.

Variable: input-decode-map

This variable holds a keymap that describes the character sequences sent by function keys on an ordinary character terminal.

The value of input-decode-map is usually set up automatically according to the terminal’s Terminfo or Termcap entry, but sometimes those need help from terminal-specific Lisp files. Emacs comes with terminal-specific files for many common terminals; their main purpose is to make entries in input-decode-map beyond those that can be deduced from Termcap and Terminfo. See section Terminal-Specific Initialization.

Variable: local-function-key-map

This variable holds a keymap similar to input-decode-map except that it describes key sequences which should be translated to alternative interpretations that are usually preferred. It applies after input-decode-map and before key-translation-map.

Entries in local-function-key-map are ignored if they conflict with bindings made in the minor mode, local, or global keymaps. I.e., the remapping only applies if the original key sequence would otherwise not have any binding.

local-function-key-map inherits from function-key-map, but the latter should not be used directly.

Variable: key-translation-map

This variable is another keymap used just like input-decode-map to translate input events into other events. It differs from input-decode-map in that it goes to work after local-function-key-map is finished rather than before; it receives the results of translation by local-function-key-map.

Just like input-decode-map, but unlike local-function-key-map, this keymap is applied regardless of whether the input key-sequence has a normal binding. Note however that actual key bindings can have an effect on key-translation-map, even though they are overridden by it. Indeed, actual key bindings override local-function-key-map and thus may alter the key sequence that key-translation-map receives. Clearly, it is better to avoid this type of situation.

The intent of key-translation-map is for users to map one character set to another, including ordinary characters normally bound to self-insert-command.

You can use input-decode-map, local-function-key-map, and key-translation-map for more than simple aliases, by using a function, instead of a key sequence, as the “translation” of a key. Then this function is called to compute the translation of that key.

The key translation function receives one argument, which is the prompt that was specified in read-key-sequence—or nil if the key sequence is being read by the editor command loop. In most cases you can ignore the prompt value.

If the function reads input itself, it can have the effect of altering the event that follows. For example, here’s how to define C-c h to turn the character that follows into a Hyper character:

(defun hyperify (prompt)
  (let ((e (read-event)))
    (vector (if (numberp e)
                (logior (lsh 1 24) e)
              (if (memq 'hyper (event-modifiers e))
                  e
                (add-event-modifier "H-" e))))))

(defun add-event-modifier (string e)
  (let ((symbol (if (symbolp e) e (car e))))
    (setq symbol (intern (concat string
                                 (symbol-name symbol))))
    (if (symbolp e)
        symbol
      (cons symbol (cdr e)))))

(define-key local-function-key-map "\C-ch" 'hyperify)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.14.1 Interaction with normal keymaps

The end of a key sequence is detected when that key sequence either is bound to a command, or when Emacs determines that no additional event can lead to a sequence that is bound to a command.

This means that, while input-decode-map and key-translation-map apply regardless of whether the original key sequence would have a binding, the presence of such a binding can still prevent translation from taking place. For example, let us return to our VT100 example above and add a binding for C-c ESC to the global map; now when the user hits C-c PF1 Emacs will fail to decode C-c ESC O P into C-c PF1 because it will stop reading keys right after C-x ESC, leaving O P for later. This is in case the user really hit C-c ESC, in which case Emacs should not sit there waiting for the next key to decide whether the user really pressed ESC or PF1.

For that reason, it is better to avoid binding commands to key sequences where the end of the key sequence is a prefix of a key translation. The main such problematic suffixes/prefixes are ESC, M-O (which is really ESC O) and M-[ (which is really ESC [).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.15 Commands for Binding Keys

This section describes some convenient interactive interfaces for changing key bindings. They work by calling define-key.

People often use global-set-key in their init files (see section The Init File) for simple customization. For example,

(global-set-key (kbd "C-x C-\\") 'next-line)

or

(global-set-key [?\C-x ?\C-\\] 'next-line)

or

(global-set-key [(control ?x) (control ?\\)] 'next-line)

redefines C-x C-\ to move down a line.

(global-set-key [M-mouse-1] 'mouse-set-point)

redefines the first (leftmost) mouse button, entered with the Meta key, to set point where you click.

Be careful when using non-ASCII text characters in Lisp specifications of keys to bind. If these are read as multibyte text, as they usually will be in a Lisp file (see section Loading Non-ASCII Characters), you must type the keys as multibyte too. For instance, if you use this:

(global-set-key "ö" 'my-function) ; bind o-umlaut

or

(global-set-key ?ö 'my-function) ; bind o-umlaut

and your language environment is multibyte Latin-1, these commands actually bind the multibyte character with code 246, not the byte code 246 (M-v) sent by a Latin-1 terminal. In order to use this binding, you need to teach Emacs how to decode the keyboard by using an appropriate input method (see Input Methods in The GNU Emacs Manual).

Command: global-set-key key binding

This function sets the binding of key in the current global map to binding.

(global-set-key key binding)
≡
(define-key (current-global-map) key binding)
Command: global-unset-key key

This function removes the binding of key from the current global map.

One use of this function is in preparation for defining a longer key that uses key as a prefix—which would not be allowed if key has a non-prefix binding. For example:

(global-unset-key "\C-l")
    ⇒ nil
(global-set-key "\C-l\C-l" 'redraw-display)
    ⇒ nil

This function is equivalent to using define-key as follows:

(global-unset-key key)
≡
(define-key (current-global-map) key nil)
Command: local-set-key key binding

This function sets the binding of key in the current local keymap to binding.

(local-set-key key binding)
≡
(define-key (current-local-map) key binding)
Command: local-unset-key key

This function removes the binding of key from the current local map.

(local-unset-key key)
≡
(define-key (current-local-map) key nil)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.16 Scanning Keymaps

This section describes functions used to scan all the current keymaps for the sake of printing help information.

Function: accessible-keymaps keymap &optional prefix

This function returns a list of all the keymaps that can be reached (via zero or more prefix keys) from keymap. The value is an association list with elements of the form (key . map), where key is a prefix key whose definition in keymap is map.

The elements of the alist are ordered so that the key increases in length. The first element is always ([] . keymap), because the specified keymap is accessible from itself with a prefix of no events.

If prefix is given, it should be a prefix key sequence; then accessible-keymaps includes only the submaps whose prefixes start with prefix. These elements look just as they do in the value of (accessible-keymaps); the only difference is that some elements are omitted.

In the example below, the returned alist indicates that the key ESC, which is displayed as ‘^[’, is a prefix key whose definition is the sparse keymap (keymap (83 . center-paragraph) (115 . foo)).

(accessible-keymaps (current-local-map))
⇒(([] keymap
      (27 keymap   ; Note this keymap for ESC is repeated below.
          (83 . center-paragraph)
          (115 . center-line))
      (9 . tab-to-tab-stop))
   ("^[" keymap
    (83 . center-paragraph)
    (115 . foo)))

In the following example, C-h is a prefix key that uses a sparse keymap starting with (keymap (118 . describe-variable)…). Another prefix, C-x 4, uses a keymap which is also the value of the variable ctl-x-4-map. The event mode-line is one of several dummy events used as prefixes for mouse actions in special parts of a window.

(accessible-keymaps (current-global-map))
⇒ (([] keymap [set-mark-command beginning-of-line …
                   delete-backward-char])
    ("^H" keymap (118 . describe-variable) …
     (8 . help-for-help))
    ("^X" keymap [x-flush-mouse-queue …
     backward-kill-sentence])
    ("^[" keymap [mark-sexp backward-sexp …
     backward-kill-word])
    ("^X4" keymap (15 . display-buffer) …)
    ([mode-line] keymap
     (S-mouse-2 . mouse-split-window-horizontally) …))

These are not all the keymaps you would see in actuality.

Function: map-keymap function keymap

The function map-keymap calls function once for each binding in keymap. It passes two arguments, the event type and the value of the binding. If keymap has a parent, the parent’s bindings are included as well. This works recursively: if the parent has itself a parent, then the grandparent’s bindings are also included and so on.

This function is the cleanest way to examine all the bindings in a keymap.

Function: where-is-internal command &optional keymap firstonly noindirect no-remap

This function is a subroutine used by the where-is command (see Help in The GNU Emacs Manual). It returns a list of all key sequences (of any length) that are bound to command in a set of keymaps.

The argument command can be any object; it is compared with all keymap entries using eq.

If keymap is nil, then the maps used are the current active keymaps, disregarding overriding-local-map (that is, pretending its value is nil). If keymap is a keymap, then the maps searched are keymap and the global keymap. If keymap is a list of keymaps, only those keymaps are searched.

Usually it’s best to use overriding-local-map as the expression for keymap. Then where-is-internal searches precisely the keymaps that are active. To search only the global map, pass the value (keymap) (an empty keymap) as keymap.

If firstonly is non-ascii, then the value is a single vector representing the first key sequence found, rather than a list of all possible key sequences. If firstonly is t, then the value is the first key sequence, except that key sequences consisting entirely of ASCII characters (or meta variants of ASCII characters) are preferred to all other key sequences and that the return value can never be a menu binding.

If noindirect is non-nil, where-is-internal doesn’t follow indirect keymap bindings. This makes it possible to search for an indirect definition itself.

The fifth argument, no-remap, determines how this function treats command remappings (see section Remapping Commands). There are two cases of interest:

If a command other-command is remapped to command:

If no-remap is nil, find the bindings for other-command and treat them as though they are also bindings for command. If no-remap is non-nil, include the vector [remap other-command] in the list of possible key sequences, instead of finding those bindings.

If command is remapped to other-command:

If no-remap is nil, return the bindings for other-command rather than command. If no-remap is non-nil, return the bindings for command, ignoring the fact that it is remapped.

Command: describe-bindings &optional prefix buffer-or-name

This function creates a listing of all current key bindings, and displays it in a buffer named *Help*. The text is grouped by modes—minor modes first, then the major mode, then global bindings.

If prefix is non-nil, it should be a prefix key; then the listing includes only keys that start with prefix.

When several characters with consecutive ASCII codes have the same definition, they are shown together, as ‘firstchar..lastchar’. In this instance, you need to know the ASCII codes to understand which characters this means. For example, in the default global map, the characters ‘SPC .. ~’ are described by a single line. SPC is ASCII 32, ~ is ASCII 126, and the characters between them include all the normal printing characters, (e.g., letters, digits, punctuation, etc.); all these characters are bound to self-insert-command.

If buffer-or-name is non-nil, it should be a buffer or a buffer name. Then describe-bindings lists that buffer’s bindings, instead of the current buffer’s.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17 Menu Keymaps

A keymap can operate as a menu as well as defining bindings for keyboard keys and mouse buttons. Menus are usually actuated with the mouse, but they can function with the keyboard also. If a menu keymap is active for the next input event, that activates the keyboard menu feature.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1 Defining Menus

A keymap acts as a menu if it has an overall prompt string, which is a string that appears as an element of the keymap. (See section Format of Keymaps.) The string should describe the purpose of the menu’s commands. Emacs displays the overall prompt string as the menu title in some cases, depending on the toolkit (if any) used for displaying menus.12 Keyboard menus also display the overall prompt string.

The easiest way to construct a keymap with a prompt string is to specify the string as an argument when you call make-keymap, make-sparse-keymap (see section Creating Keymaps), or define-prefix-command (see Definition of define-prefix-command). If you do not want the keymap to operate as a menu, don’t specify a prompt string for it.

Function: keymap-prompt keymap

This function returns the overall prompt string of keymap, or nil if it has none.

The menu’s items are the bindings in the keymap. Each binding associates an event type to a definition, but the event types have no significance for the menu appearance. (Usually we use pseudo-events, symbols that the keyboard cannot generate, as the event types for menu item bindings.) The menu is generated entirely from the bindings that correspond in the keymap to these events.

The order of items in the menu is the same as the order of bindings in the keymap. Since define-key puts new bindings at the front, you should define the menu items starting at the bottom of the menu and moving to the top, if you care about the order. When you add an item to an existing menu, you can specify its position in the menu using define-key-after (see section Modifying Menus).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1.1 Simple Menu Items

The simpler (and original) way to define a menu item is to bind some event type (it doesn’t matter what event type) to a binding like this:

(item-string . real-binding)

The CAR, item-string, is the string to be displayed in the menu. It should be short—preferably one to three words. It should describe the action of the command it corresponds to. Note that not all graphical toolkits can display non-ASCII text in menus (it will work for keyboard menus and will work to a large extent with the GTK+ toolkit).

You can also supply a second string, called the help string, as follows:

(item-string help . real-binding)

help specifies a “help-echo” string to display while the mouse is on that item in the same way as help-echo text properties (see Help display).

As far as define-key is concerned, item-string and help-string are part of the event’s binding. However, lookup-key returns just real-binding, and only real-binding is used for executing the key.

If real-binding is nil, then item-string appears in the menu but cannot be selected.

If real-binding is a symbol and has a non-nil menu-enable property, that property is an expression that controls whether the menu item is enabled. Every time the keymap is used to display a menu, Emacs evaluates the expression, and it enables the menu item only if the expression’s value is non-nil. When a menu item is disabled, it is displayed in a “fuzzy” fashion, and cannot be selected.

The menu bar does not recalculate which items are enabled every time you look at a menu. This is because the X toolkit requires the whole tree of menus in advance. To force recalculation of the menu bar, call force-mode-line-update (see section Mode Line Format).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1.2 Extended Menu Items

An extended-format menu item is a more flexible and also cleaner alternative to the simple format. You define an event type with a binding that’s a list starting with the symbol menu-item. For a non-selectable string, the binding looks like this:

(menu-item item-name)

A string starting with two or more dashes specifies a separator line; see Menu Separators.

To define a real menu item which can be selected, the extended format binding looks like this:

(menu-item item-name real-binding
    . item-property-list)

Here, item-name is an expression which evaluates to the menu item string. Thus, the string need not be a constant. The third element, real-binding, is the command to execute. The tail of the list, item-property-list, has the form of a property list which contains other information.

Here is a table of the properties that are supported:

:enable form

The result of evaluating form determines whether the item is enabled (non-nil means yes). If the item is not enabled, you can’t really click on it.

:visible form

The result of evaluating form determines whether the item should actually appear in the menu (non-nil means yes). If the item does not appear, then the menu is displayed as if this item were not defined at all.

:help help

The value of this property, help, specifies a “help-echo” string to display while the mouse is on that item. This is displayed in the same way as help-echo text properties (see Help display). Note that this must be a constant string, unlike the help-echo property for text and overlays.

:button (type . selected)

This property provides a way to define radio buttons and toggle buttons. The CAR, type, says which: it should be :toggle or :radio. The CDR, selected, should be a form; the result of evaluating it says whether this button is currently selected.

A toggle is a menu item which is labeled as either “on” or “off” according to the value of selected. The command itself should toggle selected, setting it to t if it is nil, and to nil if it is t. Here is how the menu item to toggle the debug-on-error flag is defined:

(menu-item "Debug on Error" toggle-debug-on-error
           :button (:toggle
                    . (and (boundp 'debug-on-error)
                           debug-on-error)))

This works because toggle-debug-on-error is defined as a command which toggles the variable debug-on-error.

Radio buttons are a group of menu items, in which at any time one and only one is “selected”. There should be a variable whose value says which one is selected at any time. The selected form for each radio button in the group should check whether the variable has the right value for selecting that button. Clicking on the button should set the variable so that the button you clicked on becomes selected.

:key-sequence key-sequence

This property specifies which key sequence is likely to be bound to the same command invoked by this menu item. If you specify the right key sequence, that makes preparing the menu for display run much faster.

If you specify the wrong key sequence, it has no effect; before Emacs displays key-sequence in the menu, it verifies that key-sequence is really equivalent to this menu item.

:key-sequence nil

This property indicates that there is normally no key binding which is equivalent to this menu item. Using this property saves time in preparing the menu for display, because Emacs does not need to search the keymaps for a keyboard equivalent for this menu item.

However, if the user has rebound this item’s definition to a key sequence, Emacs ignores the :keys property and finds the keyboard equivalent anyway.

:keys string

This property specifies that string is the string to display as the keyboard equivalent for this menu item. You can use the ‘\\[...]’ documentation construct in string.

:filter filter-fn

This property provides a way to compute the menu item dynamically. The property value filter-fn should be a function of one argument; when it is called, its argument will be real-binding. The function should return the binding to use instead.

Emacs can call this function at any time that it does redisplay or operates on menu data structures, so you should write it so it can safely be called at any time.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1.3 Menu Separators

A menu separator is a kind of menu item that doesn’t display any text—instead, it divides the menu into subparts with a horizontal line. A separator looks like this in the menu keymap:

(menu-item separator-type)

where separator-type is a string starting with two or more dashes.

In the simplest case, separator-type consists of only dashes. That specifies the default kind of separator. (For compatibility, "" and - also count as separators.)

Certain other values of separator-type specify a different style of separator. Here is a table of them:

"--no-line"
"--space"

An extra vertical space, with no actual line.

"--single-line"

A single line in the menu’s foreground color.

"--double-line"

A double line in the menu’s foreground color.

"--single-dashed-line"

A single dashed line in the menu’s foreground color.

"--double-dashed-line"

A double dashed line in the menu’s foreground color.

"--shadow-etched-in"

A single line with a 3D sunken appearance. This is the default, used separators consisting of dashes only.

"--shadow-etched-out"

A single line with a 3D raised appearance.

"--shadow-etched-in-dash"

A single dashed line with a 3D sunken appearance.

"--shadow-etched-out-dash"

A single dashed line with a 3D raised appearance.

"--shadow-double-etched-in"

Two lines with a 3D sunken appearance.

"--shadow-double-etched-out"

Two lines with a 3D raised appearance.

"--shadow-double-etched-in-dash"

Two dashed lines with a 3D sunken appearance.

"--shadow-double-etched-out-dash"

Two dashed lines with a 3D raised appearance.

You can also give these names in another style, adding a colon after the double-dash and replacing each single dash with capitalization of the following word. Thus, "--:singleLine", is equivalent to "--single-line".

You can use a longer form to specify keywords such as :enable and :visible for a menu separator:

(menu-item separator-type nil . item-property-list)

For example:

(menu-item "--" nil :visible (boundp 'foo))

Some systems and display toolkits don’t really handle all of these separator types. If you use a type that isn’t supported, the menu displays a similar kind of separator that is supported.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1.4 Alias Menu Items

Sometimes it is useful to make menu items that use the “same” command but with different enable conditions. The best way to do this in Emacs now is with extended menu items; before that feature existed, it could be done by defining alias commands and using them in menu items. Here’s an example that makes two aliases for read-only-mode and gives them different enable conditions:

(defalias 'make-read-only 'read-only-mode)
(put 'make-read-only 'menu-enable '(not buffer-read-only))
(defalias 'make-writable 'read-only-mode)
(put 'make-writable 'menu-enable 'buffer-read-only)

When using aliases in menus, often it is useful to display the equivalent key bindings for the “real” command name, not the aliases (which typically don’t have any key bindings except for the menu itself). To request this, give the alias symbol a non-nil menu-alias property. Thus,

(put 'make-read-only 'menu-alias t)
(put 'make-writable 'menu-alias t)

causes menu items for make-read-only and make-writable to show the keyboard bindings for read-only-mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.2 Menus and the Mouse

The usual way to make a menu keymap produce a menu is to make it the definition of a prefix key. (A Lisp program can explicitly pop up a menu and receive the user’s choice—see Pop-Up Menus.)

If the prefix key ends with a mouse event, Emacs handles the menu keymap by popping up a visible menu, so that the user can select a choice with the mouse. When the user clicks on a menu item, the event generated is whatever character or symbol has the binding that brought about that menu item. (A menu item may generate a series of events if the menu has multiple levels or comes from the menu bar.)

It’s often best to use a button-down event to trigger the menu. Then the user can select a menu item by releasing the button.

If the menu keymap contains a binding to a nested keymap, the nested keymap specifies a submenu. There will be a menu item, labeled by the nested keymap’s item string, and clicking on this item automatically pops up the specified submenu. As a special exception, if the menu keymap contains a single nested keymap and no other menu items, the menu shows the contents of the nested keymap directly, not as a submenu.

However, if Emacs is compiled without X toolkit support, or on text terminals, submenus are not supported. Each nested keymap is shown as a menu item, but clicking on it does not automatically pop up the submenu. If you wish to imitate the effect of submenus, you can do that by giving a nested keymap an item string which starts with ‘@’. This causes Emacs to display the nested keymap using a separate menu pane; the rest of the item string after the ‘@’ is the pane label. If Emacs is compiled without X toolkit support, or if a menu is displayed on a text terminal, menu panes are not used; in that case, a ‘@’ at the beginning of an item string is omitted when the menu label is displayed, and has no other effect.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.3 Menus and the Keyboard

When a prefix key ending with a keyboard event (a character or function key) has a definition that is a menu keymap, the keymap operates as a keyboard menu; the user specifies the next event by choosing a menu item with the keyboard.

Emacs displays the keyboard menu with the map’s overall prompt string, followed by the alternatives (the item strings of the map’s bindings), in the echo area. If the bindings don’t all fit at once, the user can type SPC to see the next line of alternatives. Successive uses of SPC eventually get to the end of the menu and then cycle around to the beginning. (The variable menu-prompt-more-char specifies which character is used for this; SPC is the default.)

When the user has found the desired alternative from the menu, he or she should type the corresponding character—the one whose binding is that alternative.

Variable: menu-prompt-more-char

This variable specifies the character to use to ask to see the next line of a menu. Its initial value is 32, the code for SPC.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.4 Menu Example

Here is a complete example of defining a menu keymap. It is the definition of the ‘Replace’ submenu in the ‘Edit’ menu in the menu bar, and it uses the extended menu item format (see section Extended Menu Items). First we create the keymap, and give it a name:

(defvar menu-bar-replace-menu (make-sparse-keymap "Replace"))

Next we define the menu items:

(define-key menu-bar-replace-menu [tags-repl-continue]
  '(menu-item "Continue Replace" tags-loop-continue
              :help "Continue last tags replace operation"))
(define-key menu-bar-replace-menu [tags-repl]
  '(menu-item "Replace in tagged files" tags-query-replace
              :help "Interactively replace a regexp in all tagged files"))
(define-key menu-bar-replace-menu [separator-replace-tags]
  '(menu-item "--"))
;; 

Note the symbols which the bindings are “made for”; these appear inside square brackets, in the key sequence being defined. In some cases, this symbol is the same as the command name; sometimes it is different. These symbols are treated as “function keys”, but they are not real function keys on the keyboard. They do not affect the functioning of the menu itself, but they are “echoed” in the echo area when the user selects from the menu, and they appear in the output of where-is and apropos.

The menu in this example is intended for use with the mouse. If a menu is intended for use with the keyboard, that is, if it is bound to a key sequence ending with a keyboard event, then the menu items should be bound to characters or “real” function keys, that can be typed with the keyboard.

The binding whose definition is ("--") is a separator line. Like a real menu item, the separator has a key symbol, in this case separator-replace-tags. If one menu has two separators, they must have two different key symbols.

Here is how we make this menu appear as an item in the parent menu:

(define-key menu-bar-edit-menu [replace]
  (list 'menu-item "Replace" menu-bar-replace-menu))

Note that this incorporates the submenu keymap, which is the value of the variable menu-bar-replace-menu, rather than the symbol menu-bar-replace-menu itself. Using that symbol in the parent menu item would be meaningless because menu-bar-replace-menu is not a command.

If you wanted to attach the same replace menu to a mouse click, you can do it this way:

(define-key global-map [C-S-down-mouse-1]
   menu-bar-replace-menu)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.5 The Menu Bar

Emacs usually shows a menu bar at the top of each frame. See Menu Bars in The GNU Emacs Manual. Menu bar items are subcommands of the fake “function key” menu-bar, as defined in the active keymaps.

To add an item to the menu bar, invent a fake “function key” of your own (let’s call it key), and make a binding for the key sequence [menu-bar key]. Most often, the binding is a menu keymap, so that pressing a button on the menu bar item leads to another menu.

When more than one active keymap defines the same “function key” for the menu bar, the item appears just once. If the user clicks on that menu bar item, it brings up a single, combined menu containing all the subcommands of that item—the global subcommands, the local subcommands, and the minor mode subcommands.

The variable overriding-local-map is normally ignored when determining the menu bar contents. That is, the menu bar is computed from the keymaps that would be active if overriding-local-map were nil. See section Active Keymaps.

Here’s an example of setting up a menu bar item:

;; Make a menu keymap (with a prompt string)
;; and make it the menu bar item’s definition.
(define-key global-map [menu-bar words]
  (cons "Words" (make-sparse-keymap "Words")))
;; Define specific subcommands in this menu.
(define-key global-map
  [menu-bar words forward]
  '("Forward word" . forward-word))
(define-key global-map
  [menu-bar words backward]
  '("Backward word" . backward-word))

A local keymap can cancel a menu bar item made by the global keymap by rebinding the same fake function key with undefined as the binding. For example, this is how Dired suppresses the ‘Edit’ menu bar item:

(define-key dired-mode-map [menu-bar edit] 'undefined)

Here, edit is the fake function key used by the global map for the ‘Edit’ menu bar item. The main reason to suppress a global menu bar item is to regain space for mode-specific items.

Variable: menu-bar-final-items

Normally the menu bar shows global items followed by items defined by the local maps.

This variable holds a list of fake function keys for items to display at the end of the menu bar rather than in normal sequence. The default value is (help-menu); thus, the ‘Help’ menu item normally appears at the end of the menu bar, following local menu items.

Variable: menu-bar-update-hook

This normal hook is run by redisplay to update the menu bar contents, before redisplaying the menu bar. You can use it to update menus whose contents should vary. Since this hook is run frequently, we advise you to ensure that the functions it calls do not take much time in the usual case.

Next to every menu bar item, Emacs displays a key binding that runs the same command (if such a key binding exists). This serves as a convenient hint for users who do not know the key binding. If a command has multiple bindings, Emacs normally displays the first one it finds. You can specify one particular key binding by assigning an :advertised-binding symbol property to the command. See section Substituting Key Bindings in Documentation.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.6 Tool bars

A tool bar is a row of clickable icons at the top of a frame, just below the menu bar. See Tool Bars in The GNU Emacs Manual. Emacs normally shows a tool bar on graphical displays.

On each frame, the frame parameter tool-bar-lines controls how many lines’ worth of height to reserve for the tool bar. A zero value suppresses the tool bar. If the value is nonzero, and auto-resize-tool-bars is non-nil, the tool bar expands and contracts automatically as needed to hold the specified contents. If the value is grow-only, the tool bar expands automatically, but does not contract automatically.

The tool bar contents are controlled by a menu keymap attached to a fake “function key” called tool-bar (much like the way the menu bar is controlled). So you define a tool bar item using define-key, like this:

(define-key global-map [tool-bar key] item)

where key is a fake “function key” to distinguish this item from other items, and item is a menu item key binding (see section Extended Menu Items), which says how to display this item and how it behaves.

The usual menu keymap item properties, :visible, :enable, :button, and :filter, are useful in tool bar bindings and have their normal meanings. The real-binding in the item must be a command, not a keymap; in other words, it does not work to define a tool bar icon as a prefix key.

The :help property specifies a “help-echo” string to display while the mouse is on that item. This is displayed in the same way as help-echo text properties (see Help display).

In addition, you should use the :image property; this is how you specify the image to display in the tool bar:

:image image

images is either a single image specification or a vector of four image specifications. If you use a vector of four, one of them is used, depending on circumstances:

item 0

Used when the item is enabled and selected.

item 1

Used when the item is enabled and deselected.

item 2

Used when the item is disabled and selected.

item 3

Used when the item is disabled and deselected.

The GTK+ and NS versions of Emacs ignores items 1 to 3, because disabled and/or deselected images are autocomputed from item 0.

If image is a single image specification, Emacs draws the tool bar button in disabled state by applying an edge-detection algorithm to the image.

The :rtl property specifies an alternative image to use for right-to-left languages. Only the GTK+ version of Emacs supports this at present.

Like the menu bar, the tool bar can display separators (see section Menu Separators). Tool bar separators are vertical rather than horizontal, though, and only a single style is supported. They are represented in the tool bar keymap by (menu-item "--") entries; properties like :visible are not supported for tool bar separators. Separators are rendered natively in GTK+ and Nextstep tool bars; in the other cases, they are rendered using an image of a vertical line.

The default tool bar is defined so that items specific to editing do not appear for major modes whose command symbol has a mode-class property of special (see section Major Mode Conventions). Major modes may add items to the global bar by binding [tool-bar foo] in their local map. It makes sense for some major modes to replace the default tool bar items completely, since not many can be accommodated conveniently, and the default bindings make this easy by using an indirection through tool-bar-map.

Variable: tool-bar-map

By default, the global map binds [tool-bar] as follows:

(global-set-key [tool-bar]
                `(menu-item ,(purecopy "tool bar") ignore
                            :filter tool-bar-make-keymap))

The function tool-bar-make-keymap, in turn, derives the actual tool bar map dynamically from the value of the variable tool-bar-map. Hence, you should normally adjust the default (global) tool bar by changing that map. Some major modes, such as Info mode, completely replace the global tool bar by making tool-bar-map buffer-local and setting it to a different keymap.

There are two convenience functions for defining tool bar items, as follows.

Function: tool-bar-add-item icon def key &rest props

This function adds an item to the tool bar by modifying tool-bar-map. The image to use is defined by icon, which is the base name of an XPM, XBM or PBM image file to be located by find-image. Given a value ‘"exit"’, say, exit.xpm, exit.pbm and exit.xbm would be searched for in that order on a color display. On a monochrome display, the search order is ‘.pbm’, ‘.xbm’ and ‘.xpm’. The binding to use is the command def, and key is the fake function key symbol in the prefix keymap. The remaining arguments props are additional property list elements to add to the menu item specification.

To define items in some local map, bind tool-bar-map with let around calls of this function:

(defvar foo-tool-bar-map
  (let ((tool-bar-map (make-sparse-keymap)))
    (tool-bar-add-item …)
    …
    tool-bar-map))
Function: tool-bar-add-item-from-menu command icon &optional map &rest props

This function is a convenience for defining tool bar items which are consistent with existing menu bar bindings. The binding of command is looked up in the menu bar in map (default global-map) and modified to add an image specification for icon, which is found in the same way as by tool-bar-add-item. The resulting binding is then placed in tool-bar-map, so use this function only for global tool bar items.

map must contain an appropriate keymap bound to [menu-bar]. The remaining arguments props are additional property list elements to add to the menu item specification.

Function: tool-bar-local-item-from-menu command icon in-map &optional from-map &rest props

This function is used for making non-global tool bar items. Use it like tool-bar-add-item-from-menu except that in-map specifies the local map to make the definition in. The argument from-map is like the map argument of tool-bar-add-item-from-menu.

Variable: auto-resize-tool-bars

If this variable is non-nil, the tool bar automatically resizes to show all defined tool bar items—but not larger than a quarter of the frame’s height.

If the value is grow-only, the tool bar expands automatically, but does not contract automatically. To contract the tool bar, the user has to redraw the frame by entering C-l.

If Emacs is built with GTK or Nextstep, the tool bar can only show one line, so this variable has no effect.

Variable: auto-raise-tool-bar-buttons

If this variable is non-nil, tool bar items display in raised form when the mouse moves over them.

Variable: tool-bar-button-margin

This variable specifies an extra margin to add around tool bar items. The value is an integer, a number of pixels. The default is 4.

Variable: tool-bar-button-relief

This variable specifies the shadow width for tool bar items. The value is an integer, a number of pixels. The default is 1.

Variable: tool-bar-border

This variable specifies the height of the border drawn below the tool bar area. An integer specifies height as a number of pixels. If the value is one of internal-border-width (the default) or border-width, the tool bar border height corresponds to the corresponding frame parameter.

You can define a special meaning for clicking on a tool bar item with the shift, control, meta, etc., modifiers. You do this by setting up additional items that relate to the original item through the fake function keys. Specifically, the additional items should use the modified versions of the same fake function key used to name the original item.

Thus, if the original item was defined this way,

(define-key global-map [tool-bar shell]
  '(menu-item "Shell" shell
              :image (image :type xpm :file "shell.xpm")))

then here is how you can define clicking on the same tool bar image with the shift modifier:

(define-key global-map [tool-bar S-shell] 'some-command)

See section Function Keys, for more information about how to add modifiers to function keys.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.7 Modifying Menus

When you insert a new item in an existing menu, you probably want to put it in a particular place among the menu’s existing items. If you use define-key to add the item, it normally goes at the front of the menu. To put it elsewhere in the menu, use define-key-after:

Function: define-key-after map key binding &optional after

Define a binding in map for key, with value binding, just like define-key, but position the binding in map after the binding for the event after. The argument key should be of length one—a vector or string with just one element. But after should be a single event type—a symbol or a character, not a sequence. The new binding goes after the binding for after. If after is t or is omitted, then the new binding goes last, at the end of the keymap. However, new bindings are added before any inherited keymap.

Here is an example:

(define-key-after my-menu [drink]
  '("Drink" . drink-command) 'eat)

makes a binding for the fake function key DRINK and puts it right after the binding for EAT.

Here is how to insert an item called ‘Work’ in the ‘Signals’ menu of Shell mode, after the item break:

(define-key-after
  (lookup-key shell-mode-map [menu-bar signals])
  [work] '("Work" . work-command) 'break)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.8 Easy Menu

The following macro provides a convenient way to define pop-up menus and/or menu bar menus.

Macro: easy-menu-define symbol maps doc menu

This macro defines a pop-up menu and/or menu bar submenu, whose contents are given by menu.

If symbol is non-nil, it should be a symbol; then this macro defines symbol as a function for popping up the menu (see section Pop-Up Menus), with doc as its documentation string. symbol should not be quoted.

Regardless of the value of symbol, if maps is a keymap, the menu is added to that keymap, as a top-level menu for the menu bar (see section The Menu Bar). It can also be a list of keymaps, in which case the menu is added separately to each of those keymaps.

The first element of menu must be a string, which serves as the menu label. It may be followed by any number of the following keyword-argument pairs:

:filter function

function must be a function which, if called with one argument—the list of the other menu items—returns the actual items to be displayed in the menu.

:visible include

include is an expression; if it evaluates to nil, the menu is made invisible. :included is an alias for :visible.

:active enable

enable is an expression; if it evaluates to nil, the menu is not selectable. :enable is an alias for :active.

The remaining elements in menu are menu items.

A menu item can be a vector of three elements, [name callback enable]. name is the menu item name (a string). callback is a command to run, or an expression to evaluate, when the item is chosen. enable is an expression; if it evaluates to nil, the item is disabled for selection.

Alternatively, a menu item may have the form:

   [ name callback [ keyword arg ]... ]

where name and callback have the same meanings as above, and each optional keyword and arg pair should be one of the following:

:keys keys

keys is a keyboard equivalent to the menu item (a string). This is normally not needed, as keyboard equivalents are computed automatically. keys is expanded with substitute-command-keys before it is displayed (see section Substituting Key Bindings in Documentation).

:key-sequence keys

keys is a hint for speeding up Emacs’s first display of the menu. It should be nil if you know that the menu item has no keyboard equivalent; otherwise it should be a string or vector specifying a keyboard equivalent for the menu item.

:active enable

enable is an expression; if it evaluates to nil, the item is make unselectable.. :enable is an alias for :active.

:visible include

include is an expression; if it evaluates to nil, the item is made invisible. :included is an alias for :visible.

:label form

form is an expression that is evaluated to obtain a value which serves as the menu item’s label (the default is name).

:suffix form

form is an expression that is dynamically evaluated and whose value is concatenated with the menu entry’s label.

:style style

style is a symbol describing the type of menu item; it should be toggle (a checkbox), or radio (a radio button), or anything else (meaning an ordinary menu item).

:selected selected

selected is an expression; the checkbox or radio button is selected whenever the expression’s value is non-nil.

:help help

help is a string describing the menu item.

Alternatively, a menu item can be a string. Then that string appears in the menu as unselectable text. A string consisting of dashes is displayed as a separator (see section Menu Separators).

Alternatively, a menu item can be a list with the same format as menu. This is a submenu.

Here is an example of using easy-menu-define to define a menu similar to the one defined in the example in The Menu Bar:

(easy-menu-define words-menu global-map
  "Menu for word navigation commands."
  '("Words"
     ["Forward word" forward-word]
     ["Backward word" backward-word]))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22 Major and Minor Modes

A mode is a set of definitions that customize Emacs and can be turned on and off while you edit. There are two varieties of modes: major modes, which are mutually exclusive and used for editing particular kinds of text, and minor modes, which provide features that users can enable individually.

This chapter describes how to write both major and minor modes, how to indicate them in the mode line, and how they run hooks supplied by the user. For related topics such as keymaps and syntax tables, see Keymaps, and Syntax Tables.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.1 Hooks

A hook is a variable where you can store a function or functions to be called on a particular occasion by an existing program. Emacs provides hooks for the sake of customization. Most often, hooks are set up in the init file (see section The Init File), but Lisp programs can set them also. See section Standard Hooks, for a list of some standard hook variables.

Most of the hooks in Emacs are normal hooks. These variables contain lists of functions to be called with no arguments. By convention, whenever the hook name ends in ‘-hook’, that tells you it is normal. We try to make all hooks normal, as much as possible, so that you can use them in a uniform way.

Every major mode command is supposed to run a normal hook called the mode hook as one of the last steps of initialization. This makes it easy for a user to customize the behavior of the mode, by overriding the buffer-local variable assignments already made by the mode. Most minor mode functions also run a mode hook at the end. But hooks are used in other contexts too. For example, the hook suspend-hook runs just before Emacs suspends itself (see section Suspending Emacs).

The recommended way to add a hook function to a hook is by calling add-hook (see section Setting Hooks). The hook functions may be any of the valid kinds of functions that funcall accepts (see section What Is a Function?). Most normal hook variables are initially void; add-hook knows how to deal with this. You can add hooks either globally or buffer-locally with add-hook.

If the hook variable’s name does not end with ‘-hook’, that indicates it is probably an abnormal hook. That means the hook functions are called with arguments, or their return values are used in some way. The hook’s documentation says how the functions are called. You can use add-hook to add a function to an abnormal hook, but you must write the function to follow the hook’s calling convention. By convention, abnormal hook names end in ‘-functions’.

If the variable’s name ends in ‘-function’, then its value is just a single function, not a list of functions. add-hook cannot be used to modify such a single function hook, and you have to use add-function instead (see section Advising Emacs Lisp Functions).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.1.1 Running Hooks

In this section, we document the run-hooks function, which is used to run a normal hook. We also document the functions for running various kinds of abnormal hooks.

Function: run-hooks &rest hookvars

This function takes one or more normal hook variable names as arguments, and runs each hook in turn. Each argument should be a symbol that is a normal hook variable. These arguments are processed in the order specified.

If a hook variable has a non-nil value, that value should be a list of functions. run-hooks calls all the functions, one by one, with no arguments.

The hook variable’s value can also be a single function—either a lambda expression or a symbol with a function definition—which run-hooks calls. But this usage is obsolete.

If the hook variable is buffer-local, the buffer-local variable will be used instead of the global variable. However, if the buffer-local variable contains the element t, the global hook variable will be run as well.

Function: run-hook-with-args hook &rest args

This function runs an abnormal hook by calling all the hook functions in hook, passing each one the arguments args.

Function: run-hook-with-args-until-failure hook &rest args

This function runs an abnormal hook by calling each hook function in turn, stopping if one of them “fails” by returning nil. Each hook function is passed the arguments args. If this function stops because one of the hook functions fails, it returns nil; otherwise it returns a non-nil value.

Function: run-hook-with-args-until-success hook &rest args

This function runs an abnormal hook by calling each hook function, stopping if one of them “succeeds” by returning a non-nil value. Each hook function is passed the arguments args. If this function stops because one of the hook functions returns a non-nil value, it returns that value; otherwise it returns nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.1.2 Setting Hooks

Here’s an example that uses a mode hook to turn on Auto Fill mode when in Lisp Interaction mode:

(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)
Function: add-hook hook function &optional append local

This function is the handy way to add function function to hook variable hook. You can use it for abnormal hooks as well as for normal hooks. function can be any Lisp function that can accept the proper number of arguments for hook. For example,

(add-hook 'text-mode-hook 'my-text-hook-function)

adds my-text-hook-function to the hook called text-mode-hook.

If function is already present in hook (comparing using equal), then add-hook does not add it a second time.

If function has a non-nil property permanent-local-hook, then kill-all-local-variables (or changing major modes) won’t delete it from the hook variable’s local value.

For a normal hook, hook functions should be designed so that the order in which they are executed does not matter. Any dependence on the order is asking for trouble. However, the order is predictable: normally, function goes at the front of the hook list, so it is executed first (barring another add-hook call). If the optional argument append is non-nil, the new hook function goes at the end of the hook list and is executed last.

add-hook can handle the cases where hook is void or its value is a single function; it sets or changes the value to a list of functions.

If local is non-nil, that says to add function to the buffer-local hook list instead of to the global hook list. This makes the hook buffer-local and adds t to the buffer-local value. The latter acts as a flag to run the hook functions in the default value as well as in the local value.

Function: remove-hook hook function &optional local

This function removes function from the hook variable hook. It compares function with elements of hook using equal, so it works for both symbols and lambda expressions.

If local is non-nil, that says to remove function from the buffer-local hook list instead of from the global hook list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2 Major Modes

Major modes specialize Emacs for editing particular kinds of text. Each buffer has one major mode at a time. Every major mode is associated with a major mode command, whose name should end in ‘-mode’. This command takes care of switching to that mode in the current buffer, by setting various buffer-local variables such as a local keymap. See section Major Mode Conventions.

The least specialized major mode is called Fundamental mode, which has no mode-specific definitions or variable settings.

Command: fundamental-mode

This is the major mode command for Fundamental mode. Unlike other mode commands, it does not run any mode hooks (see section Major Mode Conventions), since you are not supposed to customize this mode.

The easiest way to write a major mode is to use the macro define-derived-mode, which sets up the new mode as a variant of an existing major mode. See section Defining Derived Modes. We recommend using define-derived-mode even if the new mode is not an obvious derivative of another mode, as it automatically enforces many coding conventions for you. See section Basic Major Modes, for common modes to derive from.

The standard GNU Emacs Lisp directory tree contains the code for several major modes, in files such as text-mode.el, texinfo.el, lisp-mode.el, and rmail.el. You can study these libraries to see how modes are written.

User Option: major-mode

The buffer-local value of this variable holds the symbol for the current major mode. Its default value holds the default major mode for new buffers. The standard default value is fundamental-mode.

If the default value is nil, then whenever Emacs creates a new buffer via a command such as C-x b (switch-to-buffer), the new buffer is put in the major mode of the previously current buffer. As an exception, if the major mode of the previous buffer has a mode-class symbol property with value special, the new buffer is put in Fundamental mode (see section Major Mode Conventions).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.1 Major Mode Conventions

The code for every major mode should follow various coding conventions, including conventions for local keymap and syntax table initialization, function and variable names, and hooks.

If you use the define-derived-mode macro, it will take care of many of these conventions automatically. See section Defining Derived Modes. Note also that Fundamental mode is an exception to many of these conventions, because it represents the default state of Emacs.

The following list of conventions is only partial. Each major mode should aim for consistency in general with other Emacs major modes, as this makes Emacs as a whole more coherent. It is impossible to list here all the possible points where this issue might come up; if the Emacs developers point out an area where your major mode deviates from the usual conventions, please make it compatible.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.2 How Emacs Chooses a Major Mode

When Emacs visits a file, it automatically selects a major mode for the buffer based on information in the file name or in the file itself. It also processes local variables specified in the file text.

Command: normal-mode &optional find-file

This function establishes the proper major mode and buffer-local variable bindings for the current buffer. First it calls set-auto-mode (see below), then it runs hack-local-variables to parse, and bind or evaluate as appropriate, the file’s local variables (see section File Local Variables).

If the find-file argument to normal-mode is non-nil, normal-mode assumes that the find-file function is calling it. In this case, it may process local variables in the ‘-*-’ line or at the end of the file. The variable enable-local-variables controls whether to do so. See Local Variables in Files in The GNU Emacs Manual, for the syntax of the local variables section of a file.

If you run normal-mode interactively, the argument find-file is normally nil. In this case, normal-mode unconditionally processes any file local variables.

The function calls set-auto-mode to choose a major mode. If this does not specify a mode, the buffer stays in the major mode determined by the default value of major-mode (see below).

normal-mode uses condition-case around the call to the major mode command, so errors are caught and reported as a ‘File mode specification error’, followed by the original error message.

Function: set-auto-mode &optional keep-mode-if-same

This function selects the major mode that is appropriate for the current buffer. It bases its decision (in order of precedence) on the ‘-*- line, on any ‘mode:’ local variable near the end of a file, on the ‘#! line (using interpreter-mode-alist), on the text at the beginning of the buffer (using magic-mode-alist), and finally on the visited file name (using auto-mode-alist). See How Major Modes are Chosen in The GNU Emacs Manual. If enable-local-variables is nil, set-auto-mode does not check the ‘-*- line, or near the end of the file, for any mode tag.

There are some file types where it is not appropriate to scan the file contents for a mode specifier. For example, a tar archive may happen to contain, near the end of the file, a member file that has a local variables section specifying a mode for that particular file. This should not be applied to the containing tar file. Similarly, a tiff image file might just happen to contain a first line that seems to match the ‘-*- pattern. For these reasons, both these file extensions are members of the list inhibit-local-variables-regexps. Add patterns to this list to prevent Emacs searching them for local variables of any kind (not just mode specifiers).

If keep-mode-if-same is non-nil, this function does not call the mode command if the buffer is already in the proper major mode. For instance, set-visited-file-name sets this to t to avoid killing buffer local variables that the user may have set.

Function: set-buffer-major-mode buffer

This function sets the major mode of buffer to the default value of major-mode; if that is nil, it uses the current buffer’s major mode (if that is suitable). As an exception, if buffer’s name is *scratch*, it sets the mode to initial-major-mode.

The low-level primitives for creating buffers do not use this function, but medium-level commands such as switch-to-buffer and find-file-noselect use it whenever they create buffers.

User Option: initial-major-mode

The value of this variable determines the major mode of the initial *scratch* buffer. The value should be a symbol that is a major mode command. The default value is lisp-interaction-mode.

Variable: interpreter-mode-alist

This variable specifies major modes to use for scripts that specify a command interpreter in a ‘#!’ line. Its value is an alist with elements of the form (regexp . mode); this says to use mode mode if the file specifies an interpreter which matches \\`regexp\\'. For example, one of the default elements is ("python[0-9.]*" . python-mode).

Variable: magic-mode-alist

This variable’s value is an alist with elements of the form (regexp . function), where regexp is a regular expression and function is a function or nil. After visiting a file, set-auto-mode calls function if the text at the beginning of the buffer matches regexp and function is non-nil; if function is nil, auto-mode-alist gets to decide the mode.

Variable: magic-fallback-mode-alist

This works like magic-mode-alist, except that it is handled only if auto-mode-alist does not specify a mode for this file.

Variable: auto-mode-alist

This variable contains an association list of file name patterns (regular expressions) and corresponding major mode commands. Usually, the file name patterns test for suffixes, such as ‘.el’ and ‘.c’, but this need not be the case. An ordinary element of the alist looks like (regexp . mode-function).

For example,

(("\\`/tmp/fol/" . text-mode)
 ("\\.texinfo\\'" . texinfo-mode)
 ("\\.texi\\'" . texinfo-mode)
 ("\\.el\\'" . emacs-lisp-mode)
 ("\\.c\\'" . c-mode)
 ("\\.h\\'" . c-mode)
 …)

When you visit a file whose expanded file name (see section Functions that Expand Filenames), with version numbers and backup suffixes removed using file-name-sans-versions (see section File Name Components), matches a regexp, set-auto-mode calls the corresponding mode-function. This feature enables Emacs to select the proper major mode for most files.

If an element of auto-mode-alist has the form (regexp function t), then after calling function, Emacs searches auto-mode-alist again for a match against the portion of the file name that did not match before. This feature is useful for uncompression packages: an entry of the form ("\\.gz\\'" function t) can uncompress the file and then put the uncompressed file in the proper mode according to the name sans ‘.gz’.

Here is an example of how to prepend several pattern pairs to auto-mode-alist. (You might use this sort of expression in your init file.)

(setq auto-mode-alist
  (append
   ;; File name (within directory) starts with a dot.
   '(("/\\.[^/]*\\'" . fundamental-mode)
     ;; File name has no dot.
     ("/[^\\./]*\\'" . fundamental-mode)
     ;; File name ends in ‘.C’.
     ("\\.C\\'" . c++-mode))
   auto-mode-alist))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.3 Getting Help about a Major Mode

The describe-mode function provides information about major modes. It is normally bound to C-h m. It uses the value of the variable major-mode (see section Major Modes), which is why every major mode command needs to set that variable.

Command: describe-mode &optional buffer

This command displays the documentation of the current buffer’s major mode and minor modes. It uses the documentation function to retrieve the documentation strings of the major and minor mode commands (see section Access to Documentation Strings).

If called from Lisp with a non-nil buffer argument, this function displays the documentation for that buffer’s major and minor modes, rather than those of the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.4 Defining Derived Modes

The recommended way to define a new major mode is to derive it from an existing one using define-derived-mode. If there is no closely related mode, you should inherit from either text-mode, special-mode, or prog-mode. See section Basic Major Modes. If none of these are suitable, you can inherit from fundamental-mode (see section Major Modes).

Macro: define-derived-mode variant parent name docstring keyword-args… body…

This macro defines variant as a major mode command, using name as the string form of the mode name. variant and parent should be unquoted symbols.

The new command variant is defined to call the function parent, then override certain aspects of that parent mode:

In addition, you can specify how to override other aspects of parent with body. The command variant evaluates the forms in body after setting up all its usual overrides, just before running the mode hooks.

If parent has a non-nil mode-class symbol property, then define-derived-mode sets the mode-class property of variant to the same value. This ensures, for example, that if parent is a special mode, then variant is also a special mode (see section Major Mode Conventions).

You can also specify nil for parent. This gives the new mode no parent. Then define-derived-mode behaves as described above, but, of course, omits all actions connected with parent.

The argument docstring specifies the documentation string for the new mode. define-derived-mode adds some general information about the mode’s hook, followed by the mode’s keymap, at the end of this documentation string. If you omit docstring, define-derived-mode generates a documentation string.

The keyword-args are pairs of keywords and values. The values are evaluated. The following keywords are currently supported:

:syntax-table

You can use this to explicitly specify a syntax table for the new mode. If you specify a nil value, the new mode uses the same syntax table as parent, or the standard syntax table if parent is nil. (Note that this does not follow the convention used for non-keyword arguments that a nil value is equivalent with not specifying the argument.)

:abbrev-table

You can use this to explicitly specify an abbrev table for the new mode. If you specify a nil value, the new mode uses the same abbrev table as parent, or fundamental-mode-abbrev-table if parent is nil. (Again, a nil value is not equivalent to not specifying this keyword.)

:group

If this is specified, the value should be the customization group for this mode. (Not all major modes have one.) Only the (still experimental and unadvertised) command customize-mode currently uses this. define-derived-mode does not automatically define the specified customization group.

Here is a hypothetical example:

(define-derived-mode hypertext-mode
  text-mode "Hypertext"
  "Major mode for hypertext.
\\{hypertext-mode-map}"
  (setq case-fold-search nil))

(define-key hypertext-mode-map
  [down-mouse-3] 'do-hyper-link)

Do not write an interactive spec in the definition; define-derived-mode does that automatically.

Function: derived-mode-p &rest modes

This function returns non-nil if the current major mode is derived from any of the major modes given by the symbols modes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.5 Basic Major Modes

Apart from Fundamental mode, there are three major modes that other major modes commonly derive from: Text mode, Prog mode, and Special mode. While Text mode is useful in its own right (e.g., for editing files ending in .txt), Prog mode and Special mode exist mainly to let other modes derive from them.

As far as possible, new major modes should be derived, either directly or indirectly, from one of these three modes. One reason is that this allows users to customize a single mode hook (e.g., prog-mode-hook) for an entire family of relevant modes (e.g., all programming language modes).

Command: text-mode

Text mode is a major mode for editing human languages. It defines the ‘"’ and ‘\’ characters as having punctuation syntax (see section Table of Syntax Classes), and binds M-TAB to ispell-complete-word (see Spelling in The GNU Emacs Manual).

An example of a major mode derived from Text mode is HTML mode. See SGML and HTML Modes in The GNU Emacs Manual.

Command: prog-mode

Prog mode is a basic major mode for buffers containing programming language source code. Most of the programming language major modes built into Emacs are derived from it.

Prog mode binds parse-sexp-ignore-comments to t (see section Motion Commands Based on Parsing) and bidi-paragraph-direction to left-to-right (see section Bidirectional Display).

Command: special-mode

Special mode is a basic major mode for buffers containing text that is produced specially by Emacs, rather than directly from a file. Major modes derived from Special mode are given a mode-class property of special (see section Major Mode Conventions).

Special mode sets the buffer to read-only. Its keymap defines several common bindings, including q for quit-window and g for revert-buffer (see section Reverting).

An example of a major mode derived from Special mode is Buffer Menu mode, which is used by the *Buffer List* buffer. See Listing Existing Buffers in The GNU Emacs Manual.

In addition, modes for buffers of tabulated data can inherit from Tabulated List mode, which is in turn derived from Special mode. See section Tabulated List mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.6 Mode Hooks

Every major mode command should finish by running the mode-independent normal hook change-major-mode-after-body-hook, its mode hook, and the normal hook after-change-major-mode-hook. It does this by calling run-mode-hooks. If the major mode is a derived mode, that is if it calls another major mode (the parent mode) in its body, it should do this inside delay-mode-hooks so that the parent won’t run these hooks itself. Instead, the derived mode’s call to run-mode-hooks runs the parent’s mode hook too. See section Major Mode Conventions.

Emacs versions before Emacs 22 did not have delay-mode-hooks. Versions before 24 did not have change-major-mode-after-body-hook. When user-implemented major modes do not use run-mode-hooks and have not been updated to use these newer features, they won’t entirely follow these conventions: they may run the parent’s mode hook too early, or fail to run after-change-major-mode-hook. If you encounter such a major mode, please correct it to follow these conventions.

When you defined a major mode using define-derived-mode, it automatically makes sure these conventions are followed. If you define a major mode “by hand”, not using define-derived-mode, use the following functions to handle these conventions automatically.

Function: run-mode-hooks &rest hookvars

Major modes should run their mode hook using this function. It is similar to run-hooks (see section Hooks), but it also runs change-major-mode-after-body-hook and after-change-major-mode-hook.

When this function is called during the execution of a delay-mode-hooks form, it does not run the hooks immediately. Instead, it arranges for the next call to run-mode-hooks to run them.

Macro: delay-mode-hooks body…

When one major mode command calls another, it should do so inside of delay-mode-hooks.

This macro executes body, but tells all run-mode-hooks calls during the execution of body to delay running their hooks. The hooks will actually run during the next call to run-mode-hooks after the end of the delay-mode-hooks construct.

Variable: change-major-mode-after-body-hook

This is a normal hook run by run-mode-hooks. It is run before the mode hooks.

Variable: after-change-major-mode-hook

This is a normal hook run by run-mode-hooks. It is run at the very end of every properly-written major mode command.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.7 Tabulated List mode

Tabulated List mode is a major mode for displaying tabulated data, i.e., data consisting of entries, each entry occupying one row of text with its contents divided into columns. Tabulated List mode provides facilities for pretty-printing rows and columns, and sorting the rows according to the values in each column. It is derived from Special mode (see section Basic Major Modes).

Tabulated List mode is intended to be used as a parent mode by a more specialized major mode. Examples include Process Menu mode (see section Process Information) and Package Menu mode (see Package Menu in The GNU Emacs Manual).

Such a derived mode should use define-derived-mode in the usual way, specifying tabulated-list-mode as the second argument (see section Defining Derived Modes). The body of the define-derived-mode form should specify the format of the tabulated data, by assigning values to the variables documented below; then, it should call the function tabulated-list-init-header to initialize the header line.

The derived mode should also define a listing command. This, not the mode command, is what the user calls (e.g., M-x list-processes). The listing command should create or switch to a buffer, turn on the derived mode, specify the tabulated data, and finally call tabulated-list-print to populate the buffer.

Variable: tabulated-list-format

This buffer-local variable specifies the format of the Tabulated List data. Its value should be a vector. Each element of the vector represents a data column, and should be a list (name width sort), where

Variable: tabulated-list-entries

This buffer-local variable specifies the entries displayed in the Tabulated List buffer. Its value should be either a list, or a function.

If the value is a list, each list element corresponds to one entry, and should have the form (id contents), where

Otherwise, the value should be a function which returns a list of the above form when called with no arguments.

Variable: tabulated-list-revert-hook

This normal hook is run prior to reverting a Tabulated List buffer. A derived mode can add a function to this hook to recompute tabulated-list-entries.

Variable: tabulated-list-printer

The value of this variable is the function called to insert an entry at point, including its terminating newline. The function should accept two arguments, id and contents, having the same meanings as in tabulated-list-entries. The default value is a function which inserts an entry in a straightforward way; a mode which uses Tabulated List mode in a more complex way can specify another function.

Variable: tabulated-list-sort-key

The value of this variable specifies the current sort key for the Tabulated List buffer. If it is nil, no sorting is done. Otherwise, it should have the form (name . flip), where name is a string matching one of the column names in tabulated-list-format, and flip, if non-nil, means to invert the sort order.

Function: tabulated-list-init-header

This function computes and sets header-line-format for the Tabulated List buffer (see section Window Header Lines), and assigns a keymap to the header line to allow sort entries by clicking on column headers.

Modes derived from Tabulated List mode should call this after setting the above variables (in particular, only after setting tabulated-list-format).

Function: tabulated-list-print &optional remember-pos

This function populates the current buffer with entries. It should be called by the listing command. It erases the buffer, sorts the entries specified by tabulated-list-entries according to tabulated-list-sort-key, then calls the function specified by tabulated-list-printer to insert each entry.

If the optional argument remember-pos is non-nil, this function looks for the id element on the current line, if any, and tries to move to that entry after all the entries are (re)inserted.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.8 Generic Modes

Generic modes are simple major modes with basic support for comment syntax and Font Lock mode. To define a generic mode, use the macro define-generic-mode. See the file generic-x.el for some examples of the use of define-generic-mode.

Macro: define-generic-mode mode comment-list keyword-list font-lock-list auto-mode-list function-list &optional docstring

This macro defines a generic mode command named mode (a symbol, not quoted). The optional argument docstring is the documentation for the mode command. If you do not supply it, define-generic-mode generates one by default.

The argument comment-list is a list in which each element is either a character, a string of one or two characters, or a cons cell. A character or a string is set up in the mode’s syntax table as a “comment starter”. If the entry is a cons cell, the CAR is set up as a “comment starter” and the CDR as a “comment ender”. (Use nil for the latter if you want comments to end at the end of the line.) Note that the syntax table mechanism has limitations about what comment starters and enders are actually possible. See section Syntax Tables.

The argument keyword-list is a list of keywords to highlight with font-lock-keyword-face. Each keyword should be a string. Meanwhile, font-lock-list is a list of additional expressions to highlight. Each element of this list should have the same form as an element of font-lock-keywords. See section Search-based Fontification.

The argument auto-mode-list is a list of regular expressions to add to the variable auto-mode-alist. They are added by the execution of the define-generic-mode form, not by expanding the macro call.

Finally, function-list is a list of functions for the mode command to call for additional setup. It calls these functions just before it runs the mode hook variable mode-hook.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.9 Major Mode Examples

Text mode is perhaps the simplest mode besides Fundamental mode. Here are excerpts from text-mode.el that illustrate many of the conventions listed above:

;; Create the syntax table for this mode.
(defvar text-mode-syntax-table
  (let ((st (make-syntax-table)))
    (modify-syntax-entry ?\" ".   " st)
    (modify-syntax-entry ?\\ ".   " st)
    ;; Add `p' so M-c on `hello' leads to `Hello', not `hello'.
    (modify-syntax-entry ?' "w p" st)
    st)
  "Syntax table used while in `text-mode'.")
;; Create the keymap for this mode.
(defvar text-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "\e\t" 'ispell-complete-word)
    map)
  "Keymap for `text-mode'.
Many other modes, such as `mail-mode', `outline-mode' and
`indented-text-mode', inherit all the commands defined in this map.")

Here is how the actual mode command is defined now:

(define-derived-mode text-mode nil "Text"
  "Major mode for editing text written for humans to read.
In this mode, paragraphs are delimited only by blank or white lines.
You can thus get the full benefit of adaptive filling
 (see the variable `adaptive-fill-mode').
\\{text-mode-map}
Turning on Text mode runs the normal hook `text-mode-hook'."
  (set (make-local-variable 'text-mode-variant) t)
  (set (make-local-variable 'require-final-newline)
       mode-require-final-newline)
  (set (make-local-variable 'indent-line-function) 'indent-relative))

(The last line is redundant nowadays, since indent-relative is the default value, and we’ll delete it in a future version.)

The three Lisp modes (Lisp mode, Emacs Lisp mode, and Lisp Interaction mode) have more features than Text mode and the code is correspondingly more complicated. Here are excerpts from lisp-mode.el that illustrate how these modes are written.

Here is how the Lisp mode syntax and abbrev tables are defined:

;; Create mode-specific table variables.
(defvar lisp-mode-abbrev-table nil)
(define-abbrev-table 'lisp-mode-abbrev-table ())

(defvar lisp-mode-syntax-table
  (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
    (modify-syntax-entry ?\[ "_   " table)
    (modify-syntax-entry ?\] "_   " table)
    (modify-syntax-entry ?# "' 14" table)
    (modify-syntax-entry ?| "\" 23bn" table)
    table)
  "Syntax table used in `lisp-mode'.")

The three modes for Lisp share much of their code. For instance, each calls the following function to set various variables:

(defun lisp-mode-variables (&optional syntax keywords-case-insensitive)
  (when syntax
    (set-syntax-table lisp-mode-syntax-table))
  (setq local-abbrev-table lisp-mode-abbrev-table)
  …

Amongst other things, this function sets up the comment-start variable to handle Lisp comments:

  (make-local-variable 'comment-start)
  (setq comment-start ";")
  …

Each of the different Lisp modes has a slightly different keymap. For example, Lisp mode binds C-c C-z to run-lisp, but the other Lisp modes do not. However, all Lisp modes have some commands in common. The following code sets up the common commands:

(defvar lisp-mode-shared-map
  (let ((map (make-sparse-keymap)))
    (define-key map "\e\C-q" 'indent-sexp)
    (define-key map "\177" 'backward-delete-char-untabify)
    map)
  "Keymap for commands shared by all sorts of Lisp modes.")

And here is the code to set up the keymap for Lisp mode:

(defvar lisp-mode-map
  (let ((map (make-sparse-keymap))
	(menu-map (make-sparse-keymap "Lisp")))
    (set-keymap-parent map lisp-mode-shared-map)
    (define-key map "\e\C-x" 'lisp-eval-defun)
    (define-key map "\C-c\C-z" 'run-lisp)
    …
    map)
  "Keymap for ordinary Lisp mode.
All commands in `lisp-mode-shared-map' are inherited by this map.")

Finally, here is the major mode command for Lisp mode:

(define-derived-mode lisp-mode prog-mode "Lisp"
  "Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp.
Commands:
Delete converts tabs to spaces as it moves back.
Blank lines separate paragraphs.  Semicolons start comments.

\\{lisp-mode-map}
Note that `run-lisp' may be used either to start an inferior Lisp job
or to switch back to an existing one.
Entry to this mode calls the value of `lisp-mode-hook'
if that value is non-nil."
  (lisp-mode-variables nil t)
  (set (make-local-variable 'find-tag-default-function)
       'lisp-find-tag-default)
  (set (make-local-variable 'comment-start-skip)
       "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *")
  (setq imenu-case-fold-search t))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.3 Minor Modes

A minor mode provides optional features that users may enable or disable independently of the choice of major mode. Minor modes can be enabled individually or in combination.

Most minor modes implement features that are independent of the major mode, and can thus be used with most major modes. For example, Auto Fill mode works with any major mode that permits text insertion. A few minor modes, however, are specific to a particular major mode. For example, Diff Auto Refine mode is a minor mode that is intended to be used only with Diff mode.

Ideally, a minor mode should have its desired effect regardless of the other minor modes in effect. It should be possible to activate and deactivate minor modes in any order.

Variable: minor-mode-list

The value of this variable is a list of all minor mode commands.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.3.1 Conventions for Writing Minor Modes

There are conventions for writing minor modes just as there are for major modes. These conventions are described below. The easiest way to follow them is to use the macro define-minor-mode. See section Defining Minor Modes.

In addition, several major mode conventions apply to minor modes as well: those regarding the names of global symbols, the use of a hook at the end of the initialization function, and the use of keymaps and other tables.

The minor mode should, if possible, support enabling and disabling via Custom (see section Customization Settings). To do this, the mode variable should be defined with defcustom, usually with :type 'boolean. If just setting the variable is not sufficient to enable the mode, you should also specify a :set method which enables the mode by invoking the mode command. Note in the variable’s documentation string that setting the variable other than via Custom may not take effect. Also, mark the definition with an autoload cookie (see autoload cookie), and specify a :require so that customizing the variable will load the library that defines the mode. For example:

;;;###autoload
(defcustom msb-mode nil
  "Toggle msb-mode.
Setting this variable directly does not take effect;
use either \\[customize] or the function `msb-mode'."
  :set 'custom-set-minor-mode
  :initialize 'custom-initialize-default
  :version "20.4"
  :type    'boolean
  :group   'msb
  :require 'msb)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.3.2 Keymaps and Minor Modes

Each minor mode can have its own keymap, which is active when the mode is enabled. To set up a keymap for a minor mode, add an element to the alist minor-mode-map-alist. See Definition of minor-mode-map-alist.

One use of minor mode keymaps is to modify the behavior of certain self-inserting characters so that they do something else as well as self-insert. (Another way to customize self-insert-command is through post-self-insert-hook. Apart from this, the facilities for customizing self-insert-command are limited to special cases, designed for abbrevs and Auto Fill mode. Do not try substituting your own definition of self-insert-command for the standard one. The editor command loop handles this function specially.)

Minor modes may bind commands to key sequences consisting of C-c followed by a punctuation character. However, sequences consisting of C-c followed by one of {}<>:;, or a control character or digit, are reserved for major modes. Also, C-c letter is reserved for users. See section Key Binding Conventions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.3.3 Defining Minor Modes

The macro define-minor-mode offers a convenient way of implementing a mode in one self-contained definition.

Macro: define-minor-mode mode doc [init-value [lighter [keymap]]] keyword-args… body…

This macro defines a new minor mode whose name is mode (a symbol). It defines a command named mode to toggle the minor mode, with doc as its documentation string.

The toggle command takes one optional (prefix) argument. If called interactively with no argument it toggles the mode on or off. A positive prefix argument enables the mode, any other prefix argument disables it. From Lisp, an argument of toggle toggles the mode, whereas an omitted or nil argument enables the mode. This makes it easy to enable the minor mode in a major mode hook, for example. If doc is nil, the macro supplies a default documentation string explaining the above.

By default, it also defines a variable named mode, which is set to t or nil by enabling or disabling the mode. The variable is initialized to init-value. Except in unusual circumstances (see below), this value must be nil.

The string lighter says what to display in the mode line when the mode is enabled; if it is nil, the mode is not displayed in the mode line.

The optional argument keymap specifies the keymap for the minor mode. If non-nil, it should be a variable name (whose value is a keymap), a keymap, or an alist of the form

(key-sequence . definition)

where each key-sequence and definition are arguments suitable for passing to define-key (see section Changing Key Bindings). If keymap is a keymap or an alist, this also defines the variable mode-map.

The above three arguments init-value, lighter, and keymap can be (partially) omitted when keyword-args are used. The keyword-args consist of keywords followed by corresponding values. A few keywords have special meanings:

:group group

Custom group name to use in all generated defcustom forms. Defaults to mode without the possible trailing ‘-mode’. Warning: don’t use this default group name unless you have written a defgroup to define that group properly. See section Defining Customization Groups.

:global global

If non-nil, this specifies that the minor mode should be global rather than buffer-local. It defaults to nil.

One of the effects of making a minor mode global is that the mode variable becomes a customization variable. Toggling it through the Customize interface turns the mode on and off, and its value can be saved for future Emacs sessions (see Saving Customizations in The GNU Emacs Manual. For the saved variable to work, you should ensure that the define-minor-mode form is evaluated each time Emacs starts; for packages that are not part of Emacs, the easiest way to do this is to specify a :require keyword.

:init-value init-value

This is equivalent to specifying init-value positionally.

:lighter lighter

This is equivalent to specifying lighter positionally.

:keymap keymap

This is equivalent to specifying keymap positionally.

:variable place

This replaces the default variable mode, used to store the state of the mode. If you specify this, the mode variable is not defined, and any init-value argument is unused. place can be a different named variable (which you must define yourself), or anything that can be used with the setf function (see section Generalized Variables). place can also be a cons (get . set), where get is an expression that returns the current state, and set is a function of one argument (a state) that sets it.

:after-hook after-hook

This defines a single Lisp form which is evaluated after the mode hooks have run. It should not be quoted.

Any other keyword arguments are passed directly to the defcustom generated for the variable mode.

The command named mode first performs the standard actions such as setting the variable named mode and then executes the body forms, if any. It then runs the mode hook variable mode-hook and finishes by evaluating any form in :after-hook.

The initial value must be nil except in cases where (1) the mode is preloaded in Emacs, or (2) it is painless for loading to enable the mode even though the user did not request it. For instance, if the mode has no effect unless something else is enabled, and will always be loaded by that time, enabling it by default is harmless. But these are unusual circumstances. Normally, the initial value must be nil.

The name easy-mmode-define-minor-mode is an alias for this macro.

Here is an example of using define-minor-mode:

(define-minor-mode hungry-mode
  "Toggle Hungry mode.
Interactively with no argument, this command toggles the mode.
A positive prefix argument enables the mode, any other prefix
argument disables it.  From Lisp, argument omitted or nil enables
the mode, `toggle' toggles the state.

When Hungry mode is enabled, the control delete key
gobbles all preceding whitespace except the last.
See the command \\[hungry-electric-delete]."
 ;; The initial value.
 nil
 ;; The indicator for the mode line.
 " Hungry"
 ;; The minor mode bindings.
 '(([C-backspace] . hungry-electric-delete))
 :group 'hunger)

This defines a minor mode named “Hungry mode”, a command named hungry-mode to toggle it, a variable named hungry-mode which indicates whether the mode is enabled, and a variable named hungry-mode-map which holds the keymap that is active when the mode is enabled. It initializes the keymap with a key binding for C-DEL. It puts the variable hungry-mode into custom group hunger. There are no body forms—many minor modes don’t need any.

Here’s an equivalent way to write it:

(define-minor-mode hungry-mode
  "Toggle Hungry mode.
...rest of documentation as before..."
 ;; The initial value.
 :init-value nil
 ;; The indicator for the mode line.
 :lighter " Hungry"
 ;; The minor mode bindings.
 :keymap
 '(([C-backspace] . hungry-electric-delete)
   ([C-M-backspace]
    . (lambda ()
        (interactive)
        (hungry-electric-delete t))))
 :group 'hunger)
Macro: define-globalized-minor-mode global-mode mode turn-on keyword-args…

This defines a global toggle named global-mode whose meaning is to enable or disable the buffer-local minor mode mode in all buffers. To turn on the minor mode in a buffer, it uses the function turn-on; to turn off the minor mode, it calls mode with -1 as argument.

Globally enabling the mode also affects buffers subsequently created by visiting files, and buffers that use a major mode other than Fundamental mode; but it does not detect the creation of a new buffer in Fundamental mode.

This defines the customization option global-mode (see section Customization Settings), which can be toggled in the Customize interface to turn the minor mode on and off. As with define-minor-mode, you should ensure that the define-globalized-minor-mode form is evaluated each time Emacs starts, for example by providing a :require keyword.

Use :group group in keyword-args to specify the custom group for the mode variable of the global minor mode.

Generally speaking, when you define a globalized minor mode, you should also define a non-globalized version, so that people can use (or disable) it in individual buffers. This also allows them to disable a globally enabled minor mode in a specific major mode, by using that mode’s hook.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4 Mode Line Format

Each Emacs window (aside from minibuffer windows) typically has a mode line at the bottom, which displays status information about the buffer displayed in the window. The mode line contains information about the buffer, such as its name, associated file, depth of recursive editing, and major and minor modes. A window can also have a header line, which is much like the mode line but appears at the top of the window.

This section describes how to control the contents of the mode line and header line. We include it in this chapter because much of the information displayed in the mode line relates to the enabled major and minor modes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.1 Mode Line Basics

The contents of each mode line are specified by the buffer-local variable mode-line-format (see section The Top Level of Mode Line Control). This variable holds a mode line construct: a template that controls what is displayed on the buffer’s mode line. The value of header-line-format specifies the buffer’s header line in the same way. All windows for the same buffer use the same mode-line-format and header-line-format.

For efficiency, Emacs does not continuously recompute each window’s mode line and header line. It does so when circumstances appear to call for it—for instance, if you change the window configuration, switch buffers, narrow or widen the buffer, scroll, or modify the buffer. If you alter any of the variables referenced by mode-line-format or header-line-format (see section Variables Used in the Mode Line), or any other data structures that affect how text is displayed (see section Emacs Display), you should use the function force-mode-line-update to update the display.

Function: force-mode-line-update &optional all

This function forces Emacs to update the current buffer’s mode line and header line, based on the latest values of all relevant variables, during its next redisplay cycle. If the optional argument all is non-nil, it forces an update for all mode lines and header lines.

This function also forces an update of the menu bar and frame title.

The selected window’s mode line is usually displayed in a different color using the face mode-line. Other windows’ mode lines appear in the face mode-line-inactive instead. See section Faces.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.2 The Data Structure of the Mode Line

The mode line contents are controlled by a data structure called a mode line construct, made up of lists, strings, symbols, and numbers kept in buffer-local variables. Each data type has a specific meaning for the mode line appearance, as described below. The same data structure is used for constructing frame titles (see section Frame Titles) and header lines (see section Window Header Lines).

A mode line construct may be as simple as a fixed string of text, but it usually specifies how to combine fixed strings with variables’ values to construct the text. Many of these variables are themselves defined to have mode line constructs as their values.

Here are the meanings of various data types as mode line constructs:

string

A string as a mode line construct appears verbatim except for %-constructs in it. These stand for substitution of other data; see %-Constructs in the Mode Line.

If parts of the string have face properties, they control display of the text just as they would text in the buffer. Any characters which have no face properties are displayed, by default, in the face mode-line or mode-line-inactive (see Standard Faces in The GNU Emacs Manual). The help-echo and keymap properties in string have special meanings. See section Properties in the Mode Line.

symbol

A symbol as a mode line construct stands for its value. The value of symbol is used as a mode line construct, in place of symbol. However, the symbols t and nil are ignored, as is any symbol whose value is void.

There is one exception: if the value of symbol is a string, it is displayed verbatim: the %-constructs are not recognized.

Unless symbol is marked as “risky” (i.e., it has a non-nil risky-local-variable property), all text properties specified in symbol’s value are ignored. This includes the text properties of strings in symbol’s value, as well as all :eval and :propertize forms in it. (The reason for this is security: non-risky variables could be set automatically from file variables without prompting the user.)

(string rest…)
(list rest…)

A list whose first element is a string or list means to process all the elements recursively and concatenate the results. This is the most common form of mode line construct.

(:eval form)

A list whose first element is the symbol :eval says to evaluate form, and use the result as a string to display. Make sure this evaluation cannot load any files, as doing so could cause infinite recursion.

(:propertize elt props…)

A list whose first element is the symbol :propertize says to process the mode line construct elt recursively, then add the text properties specified by props to the result. The argument props should consist of zero or more pairs text-property value.

(symbol then else)

A list whose first element is a symbol that is not a keyword specifies a conditional. Its meaning depends on the value of symbol. If symbol has a non-nil value, the second element, then, is processed recursively as a mode line construct. Otherwise, the third element, else, is processed recursively. You may omit else; then the mode line construct displays nothing if the value of symbol is nil or void.

(width rest…)

A list whose first element is an integer specifies truncation or padding of the results of rest. The remaining elements rest are processed recursively as mode line constructs and concatenated together. When width is positive, the result is space filled on the right if its width is less than width. When width is negative, the result is truncated on the right to -width columns if its width exceeds -width.

For example, the usual way to show what percentage of a buffer is above the top of the window is to use a list like this: (-3 "%p").


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.3 The Top Level of Mode Line Control

The variable in overall control of the mode line is mode-line-format.

User Option: mode-line-format

The value of this variable is a mode line construct that controls the contents of the mode-line. It is always buffer-local in all buffers.

If you set this variable to nil in a buffer, that buffer does not have a mode line. (A window that is just one line tall also does not display a mode line.)

The default value of mode-line-format is designed to use the values of other variables such as mode-line-position and mode-line-modes (which in turn incorporates the values of the variables mode-name and minor-mode-alist). Very few modes need to alter mode-line-format itself. For most purposes, it is sufficient to alter some of the variables that mode-line-format either directly or indirectly refers to.

If you do alter mode-line-format itself, the new value should use the same variables that appear in the default value (see section Variables Used in the Mode Line), rather than duplicating their contents or displaying the information in another fashion. This way, customizations made by the user or by Lisp programs (such as display-time and major modes) via changes to those variables remain effective.

Here is a hypothetical example of a mode-line-format that might be useful for Shell mode (in reality, Shell mode does not set mode-line-format):

(setq mode-line-format
  (list "-"
   'mode-line-mule-info
   'mode-line-modified
   'mode-line-frame-identification
   "%b--"
   ;; Note that this is evaluated while making the list.
   ;; It makes a mode line construct which is just a string.
   (getenv "HOST")
   ":"
   'default-directory
   "   "
   'global-mode-string
   "   %[("
   '(:eval (mode-line-mode-name))
   'mode-line-process
   'minor-mode-alist
   "%n"
   ")%]--"
   '(which-func-mode ("" which-func-format "--"))
   '(line-number-mode "L%l--")
   '(column-number-mode "C%c--")
   '(-3 "%p")))

(The variables line-number-mode, column-number-mode and which-func-mode enable particular minor modes; as usual, these variable names are also the minor mode command names.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.4 Variables Used in the Mode Line

This section describes variables incorporated by the standard value of mode-line-format into the text of the mode line. There is nothing inherently special about these variables; any other variables could have the same effects on the mode line if the value of mode-line-format is changed to use them. However, various parts of Emacs set these variables on the understanding that they will control parts of the mode line; therefore, practically speaking, it is essential for the mode line to use them.

Variable: mode-line-mule-info

This variable holds the value of the mode line construct that displays information about the language environment, buffer coding system, and current input method. See section Non-ASCII Characters.

Variable: mode-line-modified

This variable holds the value of the mode line construct that displays whether the current buffer is modified. Its default value displays ‘**’ if the buffer is modified, ‘--’ if the buffer is not modified, ‘%%’ if the buffer is read only, and ‘%*’ if the buffer is read only and modified.

Changing this variable does not force an update of the mode line.

Variable: mode-line-frame-identification

This variable identifies the current frame. Its default value displays " " if you are using a window system which can show multiple frames, or "-%F " on an ordinary terminal which shows only one frame at a time.

Variable: mode-line-buffer-identification

This variable identifies the buffer being displayed in the window. Its default value displays the buffer name, padded with spaces to at least 12 columns.

User Option: mode-line-position

This variable indicates the position in the buffer. Its default value displays the buffer percentage and, optionally, the buffer size, the line number and the column number.

Variable: vc-mode

The variable vc-mode, buffer-local in each buffer, records whether the buffer’s visited file is maintained with version control, and, if so, which kind. Its value is a string that appears in the mode line, or nil for no version control.

User Option: mode-line-modes

This variable displays the buffer’s major and minor modes. Its default value also displays the recursive editing level, information on the process status, and whether narrowing is in effect.

Variable: mode-line-remote

This variable is used to show whether default-directory for the current buffer is remote.

Variable: mode-line-client

This variable is used to identify emacsclient frames.

The following three variables are used in mode-line-modes:

Variable: mode-name

This buffer-local variable holds the “pretty” name of the current buffer’s major mode. Each major mode should set this variable so that the mode name will appear in the mode line. The value does not have to be a string, but can use any of the data types valid in a mode-line construct (see section The Data Structure of the Mode Line). To compute the string that will identify the mode name in the mode line, use format-mode-line (see section Emulating Mode Line Formatting).

Variable: mode-line-process

This buffer-local variable contains the mode line information on process status in modes used for communicating with subprocesses. It is displayed immediately following the major mode name, with no intervening space. For example, its value in the *shell* buffer is (":%s"), which allows the shell to display its status along with the major mode as: ‘(Shell:run)’. Normally this variable is nil.

Variable: minor-mode-alist

This variable holds an association list whose elements specify how the mode line should indicate that a minor mode is active. Each element of the minor-mode-alist should be a two-element list:

(minor-mode-variable mode-line-string)

More generally, mode-line-string can be any mode line construct. It appears in the mode line when the value of minor-mode-variable is non-nil, and not otherwise. These strings should begin with spaces so that they don’t run together. Conventionally, the minor-mode-variable for a specific mode is set to a non-nil value when that minor mode is activated.

minor-mode-alist itself is not buffer-local. Each variable mentioned in the alist should be buffer-local if its minor mode can be enabled separately in each buffer.

Variable: global-mode-string

This variable holds a mode line construct that, by default, appears in the mode line just after the which-func-mode minor mode if set, else after mode-line-modes. The command display-time sets global-mode-string to refer to the variable display-time-string, which holds a string containing the time and load information.

The ‘%M’ construct substitutes the value of global-mode-string, but that is obsolete, since the variable is included in the mode line from mode-line-format.

Here is a simplified version of the default value of mode-line-format. The real default value also specifies addition of text properties.

("-"
 mode-line-mule-info
 mode-line-modified
 mode-line-frame-identification
 mode-line-buffer-identification
 "   "
 mode-line-position
 (vc-mode vc-mode)
 "   "
 mode-line-modes
 (which-func-mode ("" which-func-format "--"))
 (global-mode-string ("--" global-mode-string))
 "-%-")

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.5 %-Constructs in the Mode Line

Strings used as mode line constructs can use certain %-constructs to substitute various kinds of data. The following is a list of the defined %-constructs, and what they mean.

In any construct except ‘%%’, you can add a decimal integer after the ‘%’ to specify a minimum field width. If the width is less, the field is padded to that width. Purely numeric constructs (‘c’, ‘i’, ‘I’, and ‘l’) are padded by inserting spaces to the left, and others are padded by inserting spaces to the right.

%b

The current buffer name, obtained with the buffer-name function. See section Buffer Names.

%c

The current column number of point.

%e

When Emacs is nearly out of memory for Lisp objects, a brief message saying so. Otherwise, this is empty.

%f

The visited file name, obtained with the buffer-file-name function. See section Buffer File Name.

%F

The title (only on a window system) or the name of the selected frame. See section Basic Parameters.

%i

The size of the accessible part of the current buffer; basically (- (point-max) (point-min)).

%I

Like ‘%i’, but the size is printed in a more readable way by using ‘k’ for 10^3, ‘M’ for 10^6, ‘G’ for 10^9, etc., to abbreviate.

%l

The current line number of point, counting within the accessible portion of the buffer.

%n

Narrow’ when narrowing is in effect; nothing otherwise (see narrow-to-region in Narrowing).

%p

The percentage of the buffer text above the top of window, or ‘Top’, ‘Bottom’ or ‘All’. Note that the default mode line construct truncates this to three characters.

%P

The percentage of the buffer text that is above the bottom of the window (which includes the text visible in the window, as well as the text above the top), plus ‘Top’ if the top of the buffer is visible on screen; or ‘Bottom’ or ‘All’.

%s

The status of the subprocess belonging to the current buffer, obtained with process-status. See section Process Information.

%z

The mnemonics of keyboard, terminal, and buffer coding systems.

%Z

Like ‘%z’, but including the end-of-line format.

%*

%’ if the buffer is read only (see buffer-read-only);
*’ if the buffer is modified (see buffer-modified-p);
-’ otherwise. See section Buffer Modification.

%+

*’ if the buffer is modified (see buffer-modified-p);
%’ if the buffer is read only (see buffer-read-only);
-’ otherwise. This differs from ‘%*’ only for a modified read-only buffer. See section Buffer Modification.

%&

*’ if the buffer is modified, and ‘-’ otherwise.

%[

An indication of the depth of recursive editing levels (not counting minibuffer levels): one ‘[’ for each editing level. See section Recursive Editing.

%]

One ‘]’ for each recursive editing level (not counting minibuffer levels).

%-

Dashes sufficient to fill the remainder of the mode line.

%%

The character ‘%’—this is how to include a literal ‘%’ in a string in which %-constructs are allowed.

The following two %-constructs are still supported, but they are obsolete, since you can get the same results with the variables mode-name and global-mode-string.

%m

The value of mode-name.

%M

The value of global-mode-string.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.6 Properties in the Mode Line

Certain text properties are meaningful in the mode line. The face property affects the appearance of text; the help-echo property associates help strings with the text, and keymap can make the text mouse-sensitive.

There are four ways to specify text properties for text in the mode line:

  1. Put a string with a text property directly into the mode line data structure.
  2. Put a text property on a mode line %-construct such as ‘%12b’; then the expansion of the %-construct will have that same text property.
  3. Use a (:propertize elt props…) construct to give elt a text property specified by props.
  4. Use a list containing :eval form in the mode line data structure, and make form evaluate to a string that has a text property.

You can use the keymap property to specify a keymap. This keymap only takes real effect for mouse clicks; binding character keys and function keys to it has no effect, since it is impossible to move point into the mode line.

When the mode line refers to a variable which does not have a non-nil risky-local-variable property, any text properties given or specified within that variable’s values are ignored. This is because such properties could otherwise specify functions to be called, and those functions could come from file local variables.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.7 Window Header Lines

A window can have a header line at the top, just as it can have a mode line at the bottom. The header line feature works just like the mode line feature, except that it’s controlled by header-line-format:

Variable: header-line-format

This variable, local in every buffer, specifies how to display the header line, for windows displaying the buffer. The format of the value is the same as for mode-line-format (see section The Data Structure of the Mode Line). It is normally nil, so that ordinary buffers have no header line.

Function: window-header-line-height &optional window

This function returns the height in pixels of window’s header line. window must be a live window, and defaults to the selected window.

A window that is just one line tall never displays a header line. A window that is two lines tall cannot display both a mode line and a header line at once; if it has a mode line, then it does not display a header line.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.8 Emulating Mode Line Formatting

You can use the function format-mode-line to compute the text that would appear in a mode line or header line based on a certain mode line construct.

Function: format-mode-line format &optional face window buffer

This function formats a line of text according to format as if it were generating the mode line for window, but it also returns the text as a string. The argument window defaults to the selected window. If buffer is non-nil, all the information used is taken from buffer; by default, it comes from window’s buffer.

The value string normally has text properties that correspond to the faces, keymaps, etc., that the mode line would have. Any character for which no face property is specified by format gets a default value determined by face. If face is t, that stands for either mode-line if window is selected, otherwise mode-line-inactive. If face is nil or omitted, that stands for the default face. If face is an integer, the value returned by this function will have no text properties.

You can also specify other valid faces as the value of face. If specified, that face provides the face property for characters whose face is not specified by format.

Note that using mode-line, mode-line-inactive, or header-line as face will actually redisplay the mode line or the header line, respectively, using the current definitions of the corresponding face, in addition to returning the formatted string. (Other faces do not cause redisplay.)

For example, (format-mode-line header-line-format) returns the text that would appear in the selected window’s header line ("" if it has no header line). (format-mode-line header-line-format 'header-line) returns the same text, with each character carrying the face that it will have in the header line itself, and also redraws the header line.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.5 Imenu

Imenu is a feature that lets users select a definition or section in the buffer, from a menu which lists all of them, to go directly to that location in the buffer. Imenu works by constructing a buffer index which lists the names and buffer positions of the definitions, or other named portions of the buffer; then the user can choose one of them and move point to it. Major modes can add a menu bar item to use Imenu using imenu-add-to-menubar.

Command: imenu-add-to-menubar name

This function defines a local menu bar item named name to run Imenu.

The user-level commands for using Imenu are described in the Emacs Manual (see Imenu in the Emacs Manual). This section explains how to customize Imenu’s method of finding definitions or buffer portions for a particular major mode.

The usual and simplest way is to set the variable imenu-generic-expression:

Variable: imenu-generic-expression

This variable, if non-nil, is a list that specifies regular expressions for finding definitions for Imenu. Simple elements of imenu-generic-expression look like this:

(menu-title regexp index)

Here, if menu-title is non-nil, it says that the matches for this element should go in a submenu of the buffer index; menu-title itself specifies the name for the submenu. If menu-title is nil, the matches for this element go directly in the top level of the buffer index.

The second item in the list, regexp, is a regular expression (see section Regular Expressions); anything in the buffer that it matches is considered a definition, something to mention in the buffer index. The third item, index, is a non-negative integer that indicates which subexpression in regexp matches the definition’s name.

An element can also look like this:

(menu-title regexp index function arguments…)

Each match for this element creates an index item, and when the index item is selected by the user, it calls function with arguments consisting of the item name, the buffer position, and arguments.

For Emacs Lisp mode, imenu-generic-expression could look like this:

((nil "^\\s-*(def\\(un\\|subst\\|macro\\|advice\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2)
 ("*Vars*" "^\\s-*(def\\(var\\|const\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2)
 ("*Types*"
  "^\\s-*\
(def\\(type\\|struct\\|class\\|ine-condition\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2))

Setting this variable makes it buffer-local in the current buffer.

Variable: imenu-case-fold-search

This variable controls whether matching against the regular expressions in the value of imenu-generic-expression is case-sensitive: t, the default, means matching should ignore case.

Setting this variable makes it buffer-local in the current buffer.

Variable: imenu-syntax-alist

This variable is an alist of syntax table modifiers to use while processing imenu-generic-expression, to override the syntax table of the current buffer. Each element should have this form:

(characters . syntax-description)

The CAR, characters, can be either a character or a string. The element says to give that character or characters the syntax specified by syntax-description, which is passed to modify-syntax-entry (see section Syntax Table Functions).

This feature is typically used to give word syntax to characters which normally have symbol syntax, and thus to simplify imenu-generic-expression and speed up matching. For example, Fortran mode uses it this way:

(setq imenu-syntax-alist '(("_$" . "w")))

The imenu-generic-expression regular expressions can then use ‘\\sw+’ instead of ‘\\(\\sw\\|\\s_\\)+’. Note that this technique may be inconvenient when the mode needs to limit the initial character of a name to a smaller set of characters than are allowed in the rest of a name.

Setting this variable makes it buffer-local in the current buffer.

Another way to customize Imenu for a major mode is to set the variables imenu-prev-index-position-function and imenu-extract-index-name-function:

Variable: imenu-prev-index-position-function

If this variable is non-nil, its value should be a function that finds the next “definition” to put in the buffer index, scanning backward in the buffer from point. It should return nil if it doesn’t find another “definition” before point. Otherwise it should leave point at the place it finds a “definition” and return any non-nil value.

Setting this variable makes it buffer-local in the current buffer.

Variable: imenu-extract-index-name-function

If this variable is non-nil, its value should be a function to return the name for a definition, assuming point is in that definition as the imenu-prev-index-position-function function would leave it.

Setting this variable makes it buffer-local in the current buffer.

The last way to customize Imenu for a major mode is to set the variable imenu-create-index-function:

Variable: imenu-create-index-function

This variable specifies the function to use for creating a buffer index. The function should take no arguments, and return an index alist for the current buffer. It is called within save-excursion, so where it leaves point makes no difference.

The index alist can have three types of elements. Simple elements look like this:

(index-name . index-position)

Selecting a simple element has the effect of moving to position index-position in the buffer. Special elements look like this:

(index-name index-position function arguments…)

Selecting a special element performs:

(funcall function
         index-name index-position arguments…)

A nested sub-alist element looks like this:

(menu-title . sub-alist)

It creates the submenu menu-title specified by sub-alist.

The default value of imenu-create-index-function is imenu-default-create-index-function. This function calls the value of imenu-prev-index-position-function and the value of imenu-extract-index-name-function to produce the index alist. However, if either of these two variables is nil, the default function uses imenu-generic-expression instead.

Setting this variable makes it buffer-local in the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6 Font Lock Mode

Font Lock mode is a buffer-local minor mode that automatically attaches face properties to certain parts of the buffer based on their syntactic role. How it parses the buffer depends on the major mode; most major modes define syntactic criteria for which faces to use in which contexts. This section explains how to customize Font Lock for a particular major mode.

Font Lock mode finds text to highlight in two ways: through syntactic parsing based on the syntax table, and through searching (usually for regular expressions). Syntactic fontification happens first; it finds comments and string constants and highlights them. Search-based fontification happens second.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.1 Font Lock Basics

There are several variables that control how Font Lock mode highlights text. But major modes should not set any of these variables directly. Instead, they should set font-lock-defaults as a buffer-local variable. The value assigned to this variable is used, if and when Font Lock mode is enabled, to set all the other variables.

Variable: font-lock-defaults

This variable is set by major modes to specify how to fontify text in that mode. It automatically becomes buffer-local when set. If its value is nil, Font Lock mode does no highlighting, and you can use the ‘Faces’ menu (under ‘Edit’ and then ‘Text Properties’ in the menu bar) to assign faces explicitly to text in the buffer.

If non-nil, the value should look like this:

(keywords [keywords-only [case-fold
 [syntax-alist [syntax-begin other-vars…]]]])

The first element, keywords, indirectly specifies the value of font-lock-keywords which directs search-based fontification. It can be a symbol, a variable or a function whose value is the list to use for font-lock-keywords. It can also be a list of several such symbols, one for each possible level of fontification. The first symbol specifies the ‘mode default’ level of fontification, the next symbol level 1 fontification, the next level 2, and so on. The ‘mode default’ level is normally the same as level 1. It is used when font-lock-maximum-decoration has a nil value. See section Levels of Font Lock.

The second element, keywords-only, specifies the value of the variable font-lock-keywords-only. If this is omitted or nil, syntactic fontification (of strings and comments) is also performed. If this is non-nil, syntactic fontification is not performed. See section Syntactic Font Lock.

The third element, case-fold, specifies the value of font-lock-keywords-case-fold-search. If it is non-nil, Font Lock mode ignores case during search-based fontification.

If the fourth element, syntax-alist, is non-nil, it should be a list of cons cells of the form (char-or-string . string). These are used to set up a syntax table for syntactic fontification; the resulting syntax table is stored in font-lock-syntax-table. If syntax-alist is omitted or nil, syntactic fontification uses the syntax table returned by the syntax-table function. See section Syntax Table Functions.

The fifth element, syntax-begin, specifies the value of font-lock-beginning-of-syntax-function. We recommend setting this variable to nil and using syntax-begin-function instead.

All the remaining elements (if any) are collectively called other-vars. Each of these elements should have the form (variable . value)—which means, make variable buffer-local and then set it to value. You can use these other-vars to set other variables that affect fontification, aside from those you can control with the first five elements. See section Other Font Lock Variables.

If your mode fontifies text explicitly by adding font-lock-face properties, it can specify (nil t) for font-lock-defaults to turn off all automatic fontification. However, this is not required; it is possible to fontify some things using font-lock-face properties and set up automatic fontification for other parts of the text.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.2 Search-based Fontification

The variable which directly controls search-based fontification is font-lock-keywords, which is typically specified via the keywords element in font-lock-defaults.

Variable: font-lock-keywords

The value of this variable is a list of the keywords to highlight. Lisp programs should not set this variable directly. Normally, the value is automatically set by Font Lock mode, using the keywords element in font-lock-defaults. The value can also be altered using the functions font-lock-add-keywords and font-lock-remove-keywords (see section Customizing Search-Based Fontification).

Each element of font-lock-keywords specifies how to find certain cases of text, and how to highlight those cases. Font Lock mode processes the elements of font-lock-keywords one by one, and for each element, it finds and handles all matches. Ordinarily, once part of the text has been fontified already, this cannot be overridden by a subsequent match in the same text; but you can specify different behavior using the override element of a subexp-highlighter.

Each element of font-lock-keywords should have one of these forms:

regexp

Highlight all matches for regexp using font-lock-keyword-face. For example,

;; Highlight occurrences of the word ‘foo
;; using font-lock-keyword-face.
"\\<foo\\>"

Be careful when composing these regular expressions; a poorly written pattern can dramatically slow things down! The function regexp-opt (see section Regular Expression Functions) is useful for calculating optimal regular expressions to match several keywords.

function

Find text by calling function, and highlight the matches it finds using font-lock-keyword-face.

When function is called, it receives one argument, the limit of the search; it should begin searching at point, and not search beyond the limit. It should return non-nil if it succeeds, and set the match data to describe the match that was found. Returning nil indicates failure of the search.

Fontification will call function repeatedly with the same limit, and with point where the previous invocation left it, until function fails. On failure, function need not reset point in any particular way.

(matcher . subexp)

In this kind of element, matcher is either a regular expression or a function, as described above. The CDR, subexp, specifies which subexpression of matcher should be highlighted (instead of the entire text that matcher matched).

;; Highlight the ‘bar’ in each occurrence of ‘fubar’,
;; using font-lock-keyword-face.
("fu\\(bar\\)" . 1)

If you use regexp-opt to produce the regular expression matcher, you can use regexp-opt-depth (see section Regular Expression Functions) to calculate the value for subexp.

(matcher . facespec)

In this kind of element, facespec is an expression whose value specifies the face to use for highlighting. In the simplest case, facespec is a Lisp variable (a symbol) whose value is a face name.

;; Highlight occurrences of ‘fubar’,
;; using the face which is the value of fubar-face.
("fubar" . fubar-face)

However, facespec can also evaluate to a list of this form:

(face face prop1 val1 prop2 val2…)

to specify the face face and various additional text properties to put on the text that matches. If you do this, be sure to add the other text property names that you set in this way to the value of font-lock-extra-managed-props so that the properties will also be cleared out when they are no longer appropriate. Alternatively, you can set the variable font-lock-unfontify-region-function to a function that clears these properties. See section Other Font Lock Variables.

(matcher . subexp-highlighter)

In this kind of element, subexp-highlighter is a list which specifies how to highlight matches found by matcher. It has the form:

(subexp facespec [override [laxmatch]])

The CAR, subexp, is an integer specifying which subexpression of the match to fontify (0 means the entire matching text). The second subelement, facespec, is an expression whose value specifies the face, as described above.

The last two values in subexp-highlighter, override and laxmatch, are optional flags. If override is t, this element can override existing fontification made by previous elements of font-lock-keywords. If it is keep, then each character is fontified if it has not been fontified already by some other element. If it is prepend, the face specified by facespec is added to the beginning of the font-lock-face property. If it is append, the face is added to the end of the font-lock-face property.

If laxmatch is non-nil, it means there should be no error if there is no subexpression numbered subexp in matcher. Obviously, fontification of the subexpression numbered subexp will not occur. However, fontification of other subexpressions (and other regexps) will continue. If laxmatch is nil, and the specified subexpression is missing, then an error is signaled which terminates search-based fontification.

Here are some examples of elements of this kind, and what they do:

;; Highlight occurrences of either ‘foo’ or ‘bar’, using
;; foo-bar-face, even if they have already been highlighted.
;; foo-bar-face should be a variable whose value is a face.
("foo\\|bar" 0 foo-bar-face t)

;; Highlight the first subexpression within each occurrence
;; that the function fubar-match finds,
;; using the face which is the value of fubar-face.
(fubar-match 1 fubar-face)
(matcher . anchored-highlighter)

In this kind of element, anchored-highlighter specifies how to highlight text that follows a match found by matcher. So a match found by matcher acts as the anchor for further searches specified by anchored-highlighter. anchored-highlighter is a list of the following form:

(anchored-matcher pre-form post-form
                        subexp-highlighters…)

Here, anchored-matcher, like matcher, is either a regular expression or a function. After a match of matcher is found, point is at the end of the match. Now, Font Lock evaluates the form pre-form. Then it searches for matches of anchored-matcher and uses subexp-highlighters to highlight these. A subexp-highlighter is as described above. Finally, Font Lock evaluates post-form.

The forms pre-form and post-form can be used to initialize before, and cleanup after, anchored-matcher is used. Typically, pre-form is used to move point to some position relative to the match of matcher, before starting with anchored-matcher. post-form might be used to move back, before resuming with matcher.

After Font Lock evaluates pre-form, it does not search for anchored-matcher beyond the end of the line. However, if pre-form returns a buffer position that is greater than the position of point after pre-form is evaluated, then the position returned by pre-form is used as the limit of the search instead. It is generally a bad idea to return a position greater than the end of the line; in other words, the anchored-matcher search should not span lines.

For example,

;; Highlight occurrences of the word ‘item’ following
;; an occurrence of the word ‘anchor’ (on the same line)
;; in the value of item-face.
("\\<anchor\\>" "\\<item\\>" nil nil (0 item-face))

Here, pre-form and post-form are nil. Therefore searching for ‘item’ starts at the end of the match of ‘anchor’, and searching for subsequent instances of ‘anchor’ resumes from where searching for ‘item’ concluded.

(matcher highlighters…)

This sort of element specifies several highlighter lists for a single matcher. A highlighter list can be of the type subexp-highlighter or anchored-highlighter as described above.

For example,

;; Highlight occurrences of the word ‘anchor’ in the value
;; of anchor-face, and subsequent occurrences of the word
;; item’ (on the same line) in the value of item-face.
("\\<anchor\\>" (0 anchor-face)
                ("\\<item\\>" nil nil (0 item-face)))
(eval . form)

Here form is an expression to be evaluated the first time this value of font-lock-keywords is used in a buffer. Its value should have one of the forms described in this table.

Warning: Do not design an element of font-lock-keywords to match text which spans lines; this does not work reliably. For details, see See section Multiline Font Lock Constructs.

You can use case-fold in font-lock-defaults to specify the value of font-lock-keywords-case-fold-search which says whether search-based fontification should be case-insensitive.

Variable: font-lock-keywords-case-fold-search

Non-nil means that regular expression matching for the sake of font-lock-keywords should be case-insensitive.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.3 Customizing Search-Based Fontification

You can use font-lock-add-keywords to add additional search-based fontification rules to a major mode, and font-lock-remove-keywords to remove rules.

Function: font-lock-add-keywords mode keywords &optional how

This function adds highlighting keywords, for the current buffer or for major mode mode. The argument keywords should be a list with the same format as the variable font-lock-keywords.

If mode is a symbol which is a major mode command name, such as c-mode, the effect is that enabling Font Lock mode in mode will add keywords to font-lock-keywords. Calling with a non-nil value of mode is correct only in your ~/.emacs file.

If mode is nil, this function adds keywords to font-lock-keywords in the current buffer. This way of calling font-lock-add-keywords is usually used in mode hook functions.

By default, keywords are added at the beginning of font-lock-keywords. If the optional argument how is set, they are used to replace the value of font-lock-keywords. If how is any other non-nil value, they are added at the end of font-lock-keywords.

Some modes provide specialized support you can use in additional highlighting patterns. See the variables c-font-lock-extra-types, c++-font-lock-extra-types, and java-font-lock-extra-types, for example.

Warning: Major mode commands must not call font-lock-add-keywords under any circumstances, either directly or indirectly, except through their mode hooks. (Doing so would lead to incorrect behavior for some minor modes.) They should set up their rules for search-based fontification by setting font-lock-keywords.

Function: font-lock-remove-keywords mode keywords

This function removes keywords from font-lock-keywords for the current buffer or for major mode mode. As in font-lock-add-keywords, mode should be a major mode command name or nil. All the caveats and requirements for font-lock-add-keywords apply here too.

For example, the following code adds two fontification patterns for C mode: one to fontify the word ‘FIXME’, even in comments, and another to fontify the words ‘and’, ‘or’ and ‘not’ as keywords.

(font-lock-add-keywords 'c-mode
 '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
   ("\\<\\(and\\|or\\|not\\)\\>" . font-lock-keyword-face)))

This example affects only C mode proper. To add the same patterns to C mode and all modes derived from it, do this instead:

(add-hook 'c-mode-hook
 (lambda ()
  (font-lock-add-keywords nil
   '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
     ("\\<\\(and\\|or\\|not\\)\\>" .
      font-lock-keyword-face)))))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.4 Other Font Lock Variables

This section describes additional variables that a major mode can set by means of other-vars in font-lock-defaults (see section Font Lock Basics).

Variable: font-lock-mark-block-function

If this variable is non-nil, it should be a function that is called with no arguments, to choose an enclosing range of text for refontification for the command M-o M-o (font-lock-fontify-block).

The function should report its choice by placing the region around it. A good choice is a range of text large enough to give proper results, but not too large so that refontification becomes slow. Typical values are mark-defun for programming modes or mark-paragraph for textual modes.

Variable: font-lock-extra-managed-props

This variable specifies additional properties (other than font-lock-face) that are being managed by Font Lock mode. It is used by font-lock-default-unfontify-region, which normally only manages the font-lock-face property. If you want Font Lock to manage other properties as well, you must specify them in a facespec in font-lock-keywords as well as add them to this list. See section Search-based Fontification.

Variable: font-lock-fontify-buffer-function

Function to use for fontifying the buffer. The default value is font-lock-default-fontify-buffer.

Variable: font-lock-unfontify-buffer-function

Function to use for unfontifying the buffer. This is used when turning off Font Lock mode. The default value is font-lock-default-unfontify-buffer.

Variable: font-lock-fontify-region-function

Function to use for fontifying a region. It should take two arguments, the beginning and end of the region, and an optional third argument verbose. If verbose is non-nil, the function should print status messages. The default value is font-lock-default-fontify-region.

Variable: font-lock-unfontify-region-function

Function to use for unfontifying a region. It should take two arguments, the beginning and end of the region. The default value is font-lock-default-unfontify-region.

Function: jit-lock-register function &optional contextual

This function tells Font Lock mode to run the Lisp function function any time it has to fontify or refontify part of the current buffer. It calls function before calling the default fontification functions, and gives it two arguments, start and end, which specify the region to be fontified or refontified.

The optional argument contextual, if non-nil, forces Font Lock mode to always refontify a syntactically relevant part of the buffer, and not just the modified lines. This argument can usually be omitted.

Function: jit-lock-unregister function

If function was previously registered as a fontification function using jit-lock-register, this function unregisters it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.5 Levels of Font Lock

Some major modes offer three different levels of fontification. You can define multiple levels by using a list of symbols for keywords in font-lock-defaults. Each symbol specifies one level of fontification; it is up to the user to choose one of these levels, normally by setting font-lock-maximum-decoration (see Font Lock in the GNU Emacs Manual). The chosen level’s symbol value is used to initialize font-lock-keywords.

Here are the conventions for how to define the levels of fontification:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.6 Precalculated Fontification

Some major modes such as list-buffers and occur construct the buffer text programmatically. The easiest way for them to support Font Lock mode is to specify the faces of text when they insert the text in the buffer.

The way to do this is to specify the faces in the text with the special text property font-lock-face (see section Properties with Special Meanings). When Font Lock mode is enabled, this property controls the display, just like the face property. When Font Lock mode is disabled, font-lock-face has no effect on the display.

It is ok for a mode to use font-lock-face for some text and also use the normal Font Lock machinery. But if the mode does not use the normal Font Lock machinery, it should not set the variable font-lock-defaults.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.7 Faces for Font Lock

Font Lock mode can highlight using any face, but Emacs defines several faces specifically for Font Lock to use to highlight text. These Font Lock faces are listed below. They can also be used by major modes for syntactic highlighting outside of Font Lock mode (see section Major Mode Conventions).

Each of these symbols is both a face name, and a variable whose default value is the symbol itself. Thus, the default value of font-lock-comment-face is font-lock-comment-face.

The faces are listed with descriptions of their typical usage, and in order of greater to lesser “prominence”. If a mode’s syntactic categories do not fit well with the usage descriptions, the faces can be assigned using the ordering as a guide.

font-lock-warning-face

for a construct that is peculiar, or that greatly changes the meaning of other text, like ‘;;;###autoload’ in Emacs Lisp and ‘#error’ in C.

font-lock-function-name-face

for the name of a function being defined or declared.

font-lock-variable-name-face

for the name of a variable being defined or declared.

font-lock-keyword-face

for a keyword with special syntactic significance, like ‘for’ and ‘if’ in C.

font-lock-comment-face

for comments.

font-lock-comment-delimiter-face

for comments delimiters, like ‘/*’ and ‘*/’ in C. On most terminals, this inherits from font-lock-comment-face.

font-lock-type-face

for the names of user-defined data types.

font-lock-constant-face

for the names of constants, like ‘NULL’ in C.

font-lock-builtin-face

for the names of built-in functions.

font-lock-preprocessor-face

for preprocessor commands. This inherits, by default, from font-lock-builtin-face.

font-lock-string-face

for string constants.

font-lock-doc-face

for documentation strings in the code. This inherits, by default, from font-lock-string-face.

font-lock-negation-char-face

for easily-overlooked negation characters.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.8 Syntactic Font Lock

Syntactic fontification uses a syntax table (see section Syntax Tables) to find and highlight syntactically relevant text. If enabled, it runs prior to search-based fontification. The variable font-lock-syntactic-face-function, documented below, determines which syntactic constructs to highlight. There are several variables that affect syntactic fontification; you should set them by means of font-lock-defaults (see section Font Lock Basics).

Whenever Font Lock mode performs syntactic fontification on a stretch of text, it first calls the function specified by syntax-propertize-function. Major modes can use this to apply syntax-table text properties to override the buffer’s syntax table in special cases. See section Syntax Properties.

Variable: font-lock-keywords-only

If the value of this variable is non-nil, Font Lock does not do syntactic fontification, only search-based fontification based on font-lock-keywords. It is normally set by Font Lock mode based on the keywords-only element in font-lock-defaults.

Variable: font-lock-syntax-table

This variable holds the syntax table to use for fontification of comments and strings. It is normally set by Font Lock mode based on the syntax-alist element in font-lock-defaults. If this value is nil, syntactic fontification uses the buffer’s syntax table (the value returned by the function syntax-table; see section Syntax Table Functions).

Variable: font-lock-beginning-of-syntax-function

If this variable is non-nil, it should be a function to move point back to a position that is syntactically at “top level” and outside of strings or comments. The value is normally set through an other-vars element in font-lock-defaults. If it is nil, Font Lock uses syntax-begin-function to move back outside of any comment, string, or sexp (see section Finding the Parse State for a Position).

This variable is semi-obsolete; we usually recommend setting syntax-begin-function instead. One of its uses is to tune the behavior of syntactic fontification, e.g., to ensure that different kinds of strings or comments are highlighted differently.

The specified function is called with no arguments. It should leave point at the beginning of any enclosing syntactic block. Typical values are beginning-of-line (used when the start of the line is known to be outside a syntactic block), or beginning-of-defun for programming modes, or backward-paragraph for textual modes.

Variable: font-lock-syntactic-face-function

If this variable is non-nil, it should be a function to determine which face to use for a given syntactic element (a string or a comment). The value is normally set through an other-vars element in font-lock-defaults.

The function is called with one argument, the parse state at point returned by parse-partial-sexp, and should return a face. The default value returns font-lock-comment-face for comments and font-lock-string-face for strings (see section Faces for Font Lock).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.9 Multiline Font Lock Constructs

Normally, elements of font-lock-keywords should not match across multiple lines; that doesn’t work reliably, because Font Lock usually scans just part of the buffer, and it can miss a multi-line construct that crosses the line boundary where the scan starts. (The scan normally starts at the beginning of a line.)

Making elements that match multiline constructs work properly has two aspects: correct identification and correct rehighlighting. The first means that Font Lock finds all multiline constructs. The second means that Font Lock will correctly rehighlight all the relevant text when a multiline construct is changed—for example, if some of the text that was previously part of a multiline construct ceases to be part of it. The two aspects are closely related, and often getting one of them to work will appear to make the other also work. However, for reliable results you must attend explicitly to both aspects.

There are three ways to ensure correct identification of multiline constructs:

There are three ways to do rehighlighting of multiline constructs:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.9.1 Font Lock Multiline

One way to ensure reliable rehighlighting of multiline Font Lock constructs is to put on them the text property font-lock-multiline. It should be present and non-nil for text that is part of a multiline construct.

When Font Lock is about to highlight a range of text, it first extends the boundaries of the range as necessary so that they do not fall within text marked with the font-lock-multiline property. Then it removes any font-lock-multiline properties from the range, and highlights it. The highlighting specification (mostly font-lock-keywords) must reinstall this property each time, whenever it is appropriate.

Warning: don’t use the font-lock-multiline property on large ranges of text, because that will make rehighlighting slow.

Variable: font-lock-multiline

If the font-lock-multiline variable is set to t, Font Lock will try to add the font-lock-multiline property automatically on multiline constructs. This is not a universal solution, however, since it slows down Font Lock somewhat. It can miss some multiline constructs, or make the property larger or smaller than necessary.

For elements whose matcher is a function, the function should ensure that submatch 0 covers the whole relevant multiline construct, even if only a small subpart will be highlighted. It is often just as easy to add the font-lock-multiline property by hand.

The font-lock-multiline property is meant to ensure proper refontification; it does not automatically identify new multiline constructs. Identifying the requires that Font Lock mode operate on large enough chunks at a time. This will happen by accident on many cases, which may give the impression that multiline constructs magically work. If you set the font-lock-multiline variable non-nil, this impression will be even stronger, since the highlighting of those constructs which are found will be properly updated from then on. But that does not work reliably.

To find multiline constructs reliably, you must either manually place the font-lock-multiline property on the text before Font Lock mode looks at it, or use font-lock-fontify-region-function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.9.2 Region to Fontify after a Buffer Change

When a buffer is changed, the region that Font Lock refontifies is by default the smallest sequence of whole lines that spans the change. While this works well most of the time, sometimes it doesn’t—for example, when a change alters the syntactic meaning of text on an earlier line.

You can enlarge (or even reduce) the region to refontify by setting the following variable:

Variable: font-lock-extend-after-change-region-function

This buffer-local variable is either nil or a function for Font Lock mode to call to determine the region to scan and fontify.

The function is given three parameters, the standard beg, end, and old-len from after-change-functions (see section Change Hooks). It should return either a cons of the beginning and end buffer positions (in that order) of the region to fontify, or nil (which means choose the region in the standard way). This function needs to preserve point, the match-data, and the current restriction. The region it returns may start or end in the middle of a line.

Since this function is called after every buffer change, it should be reasonably fast.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7 Automatic Indentation of code

For programming languages, an important feature of a major mode is to provide automatic indentation. There are two parts: one is to decide what is the right indentation of a line, and the other is to decide when to reindent a line. By default, Emacs reindents a line whenever you type a character in electric-indent-chars, which by default only includes Newline. Major modes can add chars to electric-indent-chars according to the syntax of the language.

Deciding what is the right indentation is controlled in Emacs by indent-line-function (see section Indentation Controlled by Major Mode). For some modes, the right indentation cannot be known reliably, typically because indentation is significant so several indentations are valid but with different meanings. In that case, the mode should set electric-indent-inhibit to make sure the line is not constantly re-indented against the user’s wishes.

Writing a good indentation function can be difficult and to a large extent it is still a black art. Many major mode authors will start by writing a simple indentation function that works for simple cases, for example by comparing with the indentation of the previous text line. For most programming languages that are not really line-based, this tends to scale very poorly: improving such a function to let it handle more diverse situations tends to become more and more difficult, resulting in the end with a large, complex, unmaintainable indentation function which nobody dares to touch.

A good indentation function will usually need to actually parse the text, according to the syntax of the language. Luckily, it is not necessary to parse the text in as much detail as would be needed for a compiler, but on the other hand, the parser embedded in the indentation code will want to be somewhat friendly to syntactically incorrect code.

Good maintainable indentation functions usually fall into two categories: either parsing forward from some “safe” starting point until the position of interest, or parsing backward from the position of interest. Neither of the two is a clearly better choice than the other: parsing backward is often more difficult than parsing forward because programming languages are designed to be parsed forward, but for the purpose of indentation it has the advantage of not needing to guess a “safe” starting point, and it generally enjoys the property that only a minimum of text will be analyzed to decide the indentation of a line, so indentation will tend to be less affected by syntax errors in some earlier unrelated piece of code. Parsing forward on the other hand is usually easier and has the advantage of making it possible to reindent efficiently a whole region at a time, with a single parse.

Rather than write your own indentation function from scratch, it is often preferable to try and reuse some existing ones or to rely on a generic indentation engine. There are sadly few such engines. The CC-mode indentation code (used with C, C++, Java, Awk and a few other such modes) has been made more generic over the years, so if your language seems somewhat similar to one of those languages, you might try to use that engine. Another one is SMIE which takes an approach in the spirit of Lisp sexps and adapts it to non-Lisp languages.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1 Simple Minded Indentation Engine

SMIE is a package that provides a generic navigation and indentation engine. Based on a very simple parser using an “operator precedence grammar”, it lets major modes extend the sexp-based navigation of Lisp to non-Lisp languages as well as provide a simple to use but reliable auto-indentation.

Operator precedence grammar is a very primitive technology for parsing compared to some of the more common techniques used in compilers. It has the following characteristics: its parsing power is very limited, and it is largely unable to detect syntax errors, but it has the advantage of being algorithmically efficient and able to parse forward just as well as backward. In practice that means that SMIE can use it for indentation based on backward parsing, that it can provide both forward-sexp and backward-sexp functionality, and that it will naturally work on syntactically incorrect code without any extra effort. The downside is that it also means that most programming languages cannot be parsed correctly using SMIE, at least not without resorting to some special tricks (see section Living With a Weak Parser).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.1 SMIE Setup and Features

SMIE is meant to be a one-stop shop for structural navigation and various other features which rely on the syntactic structure of code, in particular automatic indentation. The main entry point is smie-setup which is a function typically called while setting up a major mode.

Function: smie-setup grammar rules-function &rest keywords

Setup SMIE navigation and indentation. grammar is a grammar table generated by smie-prec2->grammar. rules-function is a set of indentation rules for use on smie-rules-function. keywords are additional arguments, which can include the following keywords:

Calling this function is sufficient to make commands such as forward-sexp, backward-sexp, and transpose-sexps be able to properly handle structural elements other than just the paired parentheses already handled by syntax tables. For example, if the provided grammar is precise enough, transpose-sexps can correctly transpose the two arguments of a + operator, taking into account the precedence rules of the language.

Calling ‘smie-setup’ is also sufficient to make TAB indentation work in the expected way, extends blink-matching-paren to apply to elements like begin...end, and provides some commands that you can bind in the major mode keymap.

Command: smie-close-block

This command closes the most recently opened (and not yet closed) block.

Command: smie-down-list &optional arg

This command is like down-list but it also pays attention to nesting of tokens other than parentheses, such as begin...end.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.2 Operator Precedence Grammars

SMIE’s precedence grammars simply give to each token a pair of precedences: the left-precedence and the right-precedence. We say T1 < T2 if the right-precedence of token T1 is less than the left-precedence of token T2. A good way to read this < is as a kind of parenthesis: if we find ... T1 something T2 ... then that should be parsed as ... T1 (something T2 ... rather than as ... T1 something) T2 .... The latter interpretation would be the case if we had T1 > T2. If we have T1 = T2, it means that token T2 follows token T1 in the same syntactic construction, so typically we have "begin" = "end". Such pairs of precedences are sufficient to express left-associativity or right-associativity of infix operators, nesting of tokens like parentheses and many other cases.

Function: smie-prec2->grammar table

This function takes a prec2 grammar table and returns an alist suitable for use in smie-setup. The prec2 table is itself meant to be built by one of the functions below.

Function: smie-merge-prec2s &rest tables

This function takes several prec2 tables and merges them into a new prec2 table.

Function: smie-precs->prec2 precs

This function builds a prec2 table from a table of precedences precs. precs should be a list, sorted by precedence (for example "+" will come before "*"), of elements of the form (assoc op ...), where each op is a token that acts as an operator; assoc is their associativity, which can be either left, right, assoc, or nonassoc. All operators in a given element share the same precedence level and associativity.

Function: smie-bnf->prec2 bnf &rest resolvers

This function lets you specify the grammar using a BNF notation. It accepts a bnf description of the grammar along with a set of conflict resolution rules resolvers, and returns a prec2 table.

bnf is a list of nonterminal definitions of the form (nonterm rhs1 rhs2 ...) where each rhs is a (non-empty) list of terminals (aka tokens) or non-terminals.

Not all grammars are accepted:

Additionally, conflicts can occur:

Precedence conflicts can be resolved via resolvers, which is a list of precs tables (see smie-precs->prec2): for each precedence conflict, if those precs tables specify a particular constraint, then the conflict is resolved by using this constraint instead, else a conflict is reported and one of the conflicting constraints is picked arbitrarily and the others are simply ignored.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.3 Defining the Grammar of a Language

The usual way to define the SMIE grammar of a language is by defining a new global variable that holds the precedence table by giving a set of BNF rules. For example, the grammar definition for a small Pascal-like language could look like:

(require 'smie)
(defvar sample-smie-grammar
  (smie-prec2->grammar
   (smie-bnf->prec2
    '((id)
      (inst ("begin" insts "end")
            ("if" exp "then" inst "else" inst)
            (id ":=" exp)
            (exp))
      (insts (insts ";" insts) (inst))
      (exp (exp "+" exp)
           (exp "*" exp)
           ("(" exps ")"))
      (exps (exps "," exps) (exp)))
    '((assoc ";"))
    '((assoc ","))
    '((assoc "+") (assoc "*")))))

A few things to note:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.4 Defining Tokens

SMIE comes with a predefined lexical analyzer which uses syntax tables in the following way: any sequence of characters that have word or symbol syntax is considered a token, and so is any sequence of characters that have punctuation syntax. This default lexer is often a good starting point but is rarely actually correct for any given language. For example, it will consider "2,+3" to be composed of 3 tokens: "2", ",+", and "3".

To describe the lexing rules of your language to SMIE, you need 2 functions, one to fetch the next token, and another to fetch the previous token. Those functions will usually first skip whitespace and comments and then look at the next chunk of text to see if it is a special token. If so it should skip the token and return a description of this token. Usually this is simply the string extracted from the buffer, but it can be anything you want. For example:

(defvar sample-keywords-regexp
  (regexp-opt '("+" "*" "," ";" ">" ">=" "<" "<=" ":=" "=")))
(defun sample-smie-forward-token ()
  (forward-comment (point-max))
  (cond
   ((looking-at sample-keywords-regexp)
    (goto-char (match-end 0))
    (match-string-no-properties 0))
   (t (buffer-substring-no-properties
       (point)
       (progn (skip-syntax-forward "w_")
              (point))))))
(defun sample-smie-backward-token ()
  (forward-comment (- (point)))
  (cond
   ((looking-back sample-keywords-regexp (- (point) 2) t)
    (goto-char (match-beginning 0))
    (match-string-no-properties 0))
   (t (buffer-substring-no-properties
       (point)
       (progn (skip-syntax-backward "w_")
              (point))))))

Notice how those lexers return the empty string when in front of parentheses. This is because SMIE automatically takes care of the parentheses defined in the syntax table. More specifically if the lexer returns nil or an empty string, SMIE tries to handle the corresponding text as a sexp according to syntax tables.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.5 Living With a Weak Parser

The parsing technique used by SMIE does not allow tokens to behave differently in different contexts. For most programming languages, this manifests itself by precedence conflicts when converting the BNF grammar.

Sometimes, those conflicts can be worked around by expressing the grammar slightly differently. For example, for Modula-2 it might seem natural to have a BNF grammar that looks like this:

  ...
  (inst ("IF" exp "THEN" insts "ELSE" insts "END")
        ("CASE" exp "OF" cases "END")
        ...)
  (cases (cases "|" cases)
         (caselabel ":" insts)
         ("ELSE" insts))
  ...

But this will create conflicts for "ELSE": on the one hand, the IF rule implies (among many other things) that "ELSE" = "END"; but on the other hand, since "ELSE" appears within cases, which appears left of "END", we also have "ELSE" > "END". We can solve the conflict either by using:

  ...
  (inst ("IF" exp "THEN" insts "ELSE" insts "END")
        ("CASE" exp "OF" cases "END")
        ("CASE" exp "OF" cases "ELSE" insts "END")
        ...)
  (cases (cases "|" cases) (caselabel ":" insts))
  ...

or

  ...
  (inst ("IF" exp "THEN" else "END")
        ("CASE" exp "OF" cases "END")
        ...)
  (else (insts "ELSE" insts))
  (cases (cases "|" cases) (caselabel ":" insts) (else))
  ...

Reworking the grammar to try and solve conflicts has its downsides, tho, because SMIE assumes that the grammar reflects the logical structure of the code, so it is preferable to keep the BNF closer to the intended abstract syntax tree.

Other times, after careful consideration you may conclude that those conflicts are not serious and simply resolve them via the resolvers argument of smie-bnf->prec2. Usually this is because the grammar is simply ambiguous: the conflict does not affect the set of programs described by the grammar, but only the way those programs are parsed. This is typically the case for separators and associative infix operators, where you want to add a resolver like '((assoc "|")). Another case where this can happen is for the classic dangling else problem, where you will use '((assoc "else" "then")). It can also happen for cases where the conflict is real and cannot really be resolved, but it is unlikely to pose a problem in practice.

Finally, in many cases some conflicts will remain despite all efforts to restructure the grammar. Do not despair: while the parser cannot be made more clever, you can make the lexer as smart as you want. So, the solution is then to look at the tokens involved in the conflict and to split one of those tokens into 2 (or more) different tokens. E.g., if the grammar needs to distinguish between two incompatible uses of the token "begin", make the lexer return different tokens (say "begin-fun" and "begin-plain") depending on which kind of "begin" it finds. This pushes the work of distinguishing the different cases to the lexer, which will thus have to look at the surrounding text to find ad-hoc clues.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.6 Specifying Indentation Rules

Based on the provided grammar, SMIE will be able to provide automatic indentation without any extra effort. But in practice, this default indentation style will probably not be good enough. You will want to tweak it in many different cases.

SMIE indentation is based on the idea that indentation rules should be as local as possible. To this end, it relies on the idea of virtual indentation, which is the indentation that a particular program point would have if it were at the beginning of a line. Of course, if that program point is indeed at the beginning of a line, its virtual indentation is its current indentation. But if not, then SMIE uses the indentation algorithm to compute the virtual indentation of that point. Now in practice, the virtual indentation of a program point does not have to be identical to the indentation it would have if we inserted a newline before it. To see how this works, the SMIE rule for indentation after a { in C does not care whether the { is standing on a line of its own or is at the end of the preceding line. Instead, these different cases are handled in the indentation rule that decides how to indent before a {.

Another important concept is the notion of parent: The parent of a token, is the head token of the nearest enclosing syntactic construct. For example, the parent of an else is the if to which it belongs, and the parent of an if, in turn, is the lead token of the surrounding construct. The command backward-sexp jumps from a token to its parent, but there are some caveats: for openers (tokens which start a construct, like if), you need to start with point before the token, while for others you need to start with point after the token. backward-sexp stops with point before the parent token if that is the opener of the token of interest, and otherwise it stops with point after the parent token.

SMIE indentation rules are specified using a function that takes two arguments method and arg where the meaning of arg and the expected return value depend on method.

method can be:

When arg is a token, the function is called with point just before that token. A return value of nil always means to fallback on the default behavior, so the function should return nil for arguments it does not expect.

offset can be:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.7 Helper Functions for Indentation Rules

SMIE provides various functions designed specifically for use in the indentation rules function (several of those functions break if used in another context). These functions all start with the prefix smie-rule-.

Function: smie-rule-bolp

Return non-nil if the current token is the first on the line.

Function: smie-rule-hanging-p

Return non-nil if the current token is hanging. A token is hanging if it is the last token on the line and if it is preceded by other tokens: a lone token on a line is not hanging.

Function: smie-rule-next-p &rest tokens

Return non-nil if the next token is among tokens.

Function: smie-rule-prev-p &rest tokens

Return non-nil if the previous token is among tokens.

Function: smie-rule-parent-p &rest parents

Return non-nil if the current token’s parent is among parents.

Function: smie-rule-sibling-p

Return non-nil if the current token’s parent is actually a sibling. This is the case for example when the parent of a "," is just the previous ",".

Function: smie-rule-parent &optional offset

Return the proper offset to align the current token with the parent. If non-nil, offset should be an integer giving an additional offset to apply.

Function: smie-rule-separator method

Indent current token as a separator.

By separator, we mean here a token whose sole purpose is to separate various elements within some enclosing syntactic construct, and which does not have any semantic significance in itself (i.e., it would typically not exist as a node in an abstract syntax tree).

Such a token is expected to have an associative syntax and be closely tied to its syntactic parent. Typical examples are "," in lists of arguments (enclosed inside parentheses), or ";" in sequences of instructions (enclosed in a {...} or begin...end block).

method should be the method name that was passed to ‘smie-rules-function’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.8 Sample Indentation Rules

Here is an example of an indentation function:

(defun sample-smie-rules (kind token)
  (pcase (cons kind token)
    (`(:elem . basic) sample-indent-basic)
    (`(,_ . ",") (smie-rule-separator kind))
    (`(:after . ":=") sample-indent-basic)
    (`(:before . ,(or `"begin" `"(" `"{")))
     (if (smie-rule-hanging-p) (smie-rule-parent)))
    (`(:before . "if")
     (and (not (smie-rule-bolp)) (smie-rule-prev-p "else")
          (smie-rule-parent)))))

A few things to note:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.9 Customizing Indentation

If you are using a mode whose indentation is provided by SMIE, you can customize the indentation to suit your preferences. You can do this on a per-mode basis (using the option smie-config), or a per-file basis (using the function smie-config-local in a file-local variable specification).

User Option: smie-config

This option lets you customize indentation on a per-mode basis. It is an alist with elements of the form (mode . rules). For the precise form of rules, see the variable’s documentation; but you may find it easier to use the command smie-config-guess.

Command: smie-config-guess

This command tries to work out appropriate settings to produce your preferred style of indentation. Simply call the command while visiting a file that is indented with your style.

Command: smie-config-save

Call this command after using smie-config-guess, to save your settings for future sessions.

Command: smie-config-show-indent &optional move

This command displays the rules that are used to indent the current line.

Command: smie-config-set-indent

This command adds a local rule to adjust the indentation of the current line.

Function: smie-config-local rules

This function adds rules as indentation rules for the current buffer. These add to any mode-specific rules defined by the smie-config option. To specify custom indentation rules for a specific file, add an entry to the file’s local variables of the form: eval: (smie-config-local '(rules)).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.8 Desktop Save Mode

Desktop Save Mode is a feature to save the state of Emacs from one session to another. The user-level commands for using Desktop Save Mode are described in the GNU Emacs Manual (see Saving Emacs Sessions in the GNU Emacs Manual). Modes whose buffers visit a file, don’t have to do anything to use this feature.

For buffers not visiting a file to have their state saved, the major mode must bind the buffer local variable desktop-save-buffer to a non-nil value.

Variable: desktop-save-buffer

If this buffer-local variable is non-nil, the buffer will have its state saved in the desktop file at desktop save. If the value is a function, it is called at desktop save with argument desktop-dirname, and its value is saved in the desktop file along with the state of the buffer for which it was called. When file names are returned as part of the auxiliary information, they should be formatted using the call

(desktop-file-name file-name desktop-dirname)

For buffers not visiting a file to be restored, the major mode must define a function to do the job, and that function must be listed in the alist desktop-buffer-mode-handlers.

Variable: desktop-buffer-mode-handlers

Alist with elements

(major-mode . restore-buffer-function)

The function restore-buffer-function will be called with argument list

(buffer-file-name buffer-name desktop-buffer-misc)

and it should return the restored buffer. Here desktop-buffer-misc is the value returned by the function optionally bound to desktop-save-buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23 Documentation

GNU Emacs has convenient built-in help facilities, most of which derive their information from documentation strings associated with functions and variables. This chapter describes how to access documentation strings in Lisp programs.

The contents of a documentation string should follow certain conventions. In particular, its first line should be a complete sentence (or two complete sentences) that briefly describes what the function or variable does. See section Tips for Documentation Strings, for how to write good documentation strings.

Note that the documentation strings for Emacs are not the same thing as the Emacs manual. Manuals have their own source files, written in the Texinfo language; documentation strings are specified in the definitions of the functions and variables they apply to. A collection of documentation strings is not sufficient as a manual because a good manual is not organized in that fashion; it is organized in terms of topics of discussion.

For commands to display documentation strings, see Help in The GNU Emacs Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.1 Documentation Basics

A documentation string is written using the Lisp syntax for strings, with double-quote characters surrounding the text. It is, in fact, an actual Lisp string. When the string appears in the proper place in a function or variable definition, it serves as the function’s or variable’s documentation.

In a function definition (a lambda or defun form), the documentation string is specified after the argument list, and is normally stored directly in the function object. See section Documentation Strings of Functions. You can also put function documentation in the function-documentation property of a function name (see section Access to Documentation Strings).

In a variable definition (a defvar form), the documentation string is specified after the initial value. See section Defining Global Variables. The string is stored in the variable’s variable-documentation property.

Sometimes, Emacs does not keep documentation strings in memory. There are two such circumstances. Firstly, to save memory, the documentation for preloaded functions and variables (including primitives) is kept in a file named DOC, in the directory specified by doc-directory (see section Access to Documentation Strings). Secondly, when a function or variable is loaded from a byte-compiled file, Emacs avoids loading its documentation string (see section Documentation Strings and Compilation). In both cases, Emacs looks up the documentation string from the file only when needed, such as when the user calls C-h f (describe-function) for a function.

Documentation strings can contain special key substitution sequences, referring to key bindings which are looked up only when the user views the documentation. This allows the help commands to display the correct keys even if a user rearranges the default key bindings. See section Substituting Key Bindings in Documentation.

In the documentation string of an autoloaded command (see section Autoload), these key-substitution sequences have an additional special effect: they cause C-h f on the command to trigger autoloading. (This is needed for correctly setting up the hyperlinks in the *Help* buffer.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.2 Access to Documentation Strings

Function: documentation-property symbol property &optional verbatim

This function returns the documentation string recorded in symbol’s property list under property property. It is most often used to look up the documentation strings of variables, for which property is variable-documentation. However, it can also be used to look up other kinds of documentation, such as for customization groups (but for function documentation, use the documentation function, below).

If the property value refers to a documentation string stored in the DOC file or a byte-compiled file, this function looks up that string and returns it.

If the property value isn’t nil, isn’t a string, and doesn’t refer to text in a file, then it is evaluated as a Lisp expression to obtain a string.

Finally, this function passes the string through substitute-command-keys to substitute key bindings (see section Substituting Key Bindings in Documentation). It skips this step if verbatim is non-nil.

(documentation-property 'command-line-processed
   'variable-documentation)
     ⇒ "Non-nil once command line has been processed"
(symbol-plist 'command-line-processed)
     ⇒ (variable-documentation 188902)
(documentation-property 'emacs 'group-documentation)
     ⇒ "Customization of the One True Editor."
Function: documentation function &optional verbatim

This function returns the documentation string of function. It handles macros, named keyboard macros, and special forms, as well as ordinary functions.

If function is a symbol, this function first looks for the function-documentation property of that symbol; if that has a non-nil value, the documentation comes from that value (if the value is not a string, it is evaluated).

If function is not a symbol, or if it has no function-documentation property, then documentation extracts the documentation string from the actual function definition, reading it from a file if called for.

Finally, unless verbatim is non-nil, this function calls substitute-command-keys. The result is the documentation string to return.

The documentation function signals a void-function error if function has no function definition. However, it is OK if the function definition has no documentation string. In that case, documentation returns nil.

Function: face-documentation face

This function returns the documentation string of face as a face.

Here is an example of using the two functions, documentation and documentation-property, to display the documentation strings for several symbols in a *Help* buffer.

(defun describe-symbols (pattern)
  "Describe the Emacs Lisp symbols matching PATTERN.
All symbols that have PATTERN in their name are described
in the `*Help*' buffer."
  (interactive "sDescribe symbols matching: ")
  (let ((describe-func
         (function
          (lambda (s)
            ;; Print description of symbol.
            (if (fboundp s)             ; It is a function.
                (princ
                 (format "%s\t%s\n%s\n\n" s
                   (if (commandp s)
                       (let ((keys (where-is-internal s)))
                         (if keys
                             (concat
                              "Keys: "
                              (mapconcat 'key-description
                                         keys " "))
                           "Keys: none"))
                     "Function")
                   (or (documentation s)
                       "not documented"))))

            (if (boundp s)              ; It is a variable.
                (princ
                 (format "%s\t%s\n%s\n\n" s
                   (if (custom-variable-p s)
                       "Option " "Variable")
                   (or (documentation-property
                         s 'variable-documentation)
                       "not documented")))))))
        sym-list)
    ;; Build a list of symbols that match pattern.
    (mapatoms (function
               (lambda (sym)
                 (if (string-match pattern (symbol-name sym))
                     (setq sym-list (cons sym sym-list))))))
    ;; Display the data.
    (help-setup-xref (list 'describe-symbols pattern) (interactive-p))
    (with-help-window (help-buffer)
      (mapcar describe-func (sort sym-list 'string<)))))

The describe-symbols function works like apropos, but provides more information.

(describe-symbols "goal")

---------- Buffer: *Help* ----------
goal-column     Option
Semipermanent goal column for vertical motion, as set by …
set-goal-column Keys: C-x C-n
Set the current horizontal position as a goal for C-n and C-p.
Those commands will move to this position in the line moved to
rather than trying to keep the same horizontal position.
With a non-nil argument, clears out the goal column
so that C-n and C-p resume vertical motion.
The goal column is stored in the variable `goal-column'.
temporary-goal-column   Variable
Current goal column for vertical motion.
It is the column where point was
at the start of current run of vertical motion commands.
When the `track-eol' feature is doing its job, the value is 9999.
---------- Buffer: *Help* ----------
Function: Snarf-documentation filename

This function is used when building Emacs, just before the runnable Emacs is dumped. It finds the positions of the documentation strings stored in the file filename, and records those positions into memory in the function definitions and variable property lists. See section Building Emacs.

Emacs reads the file filename from the emacs/etc directory. When the dumped Emacs is later executed, the same file will be looked for in the directory doc-directory. Usually filename is "DOC".

Variable: doc-directory

This variable holds the name of the directory which should contain the file "DOC" that contains documentation strings for built-in and preloaded functions and variables.

In most cases, this is the same as data-directory. They may be different when you run Emacs from the directory where you built it, without actually installing it. See Definition of data-directory.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.3 Substituting Key Bindings in Documentation

When documentation strings refer to key sequences, they should use the current, actual key bindings. They can do so using certain special text sequences described below. Accessing documentation strings in the usual way substitutes current key binding information for these special sequences. This works by calling substitute-command-keys. You can also call that function yourself.

Here is a list of the special sequences and what they mean:

\[command]

stands for a key sequence that will invoke command, or ‘M-x command’ if command has no key bindings.

\{mapvar}

stands for a summary of the keymap which is the value of the variable mapvar. The summary is made using describe-bindings.

\<mapvar>

stands for no text itself. It is used only for a side effect: it specifies mapvar’s value as the keymap for any following ‘\[command]’ sequences in this documentation string.

\=

quotes the following character and is discarded; thus, ‘\=\[’ puts ‘\[’ into the output, and ‘\=\=’ puts ‘\=’ into the output.

Please note: Each ‘\’ must be doubled when written in a string in Emacs Lisp.

Function: substitute-command-keys string

This function scans string for the above special sequences and replaces them by what they stand for, returning the result as a string. This permits display of documentation that refers accurately to the user’s own customized key bindings.

If a command has multiple bindings, this function normally uses the first one it finds. You can specify one particular key binding by assigning an :advertised-binding symbol property to the command, like this:

(put 'undo :advertised-binding [?\C-/])

The :advertised-binding property also affects the binding shown in menu items (see section The Menu Bar). The property is ignored if it specifies a key binding that the command does not actually have.

Here are examples of the special sequences:

(substitute-command-keys
   "To abort recursive edit, type: \\[abort-recursive-edit]")
⇒ "To abort recursive edit, type: C-]"
(substitute-command-keys
   "The keys that are defined for the minibuffer here are:
  \\{minibuffer-local-must-match-map}")
⇒ "The keys that are defined for the minibuffer here are:
?               minibuffer-completion-help
SPC             minibuffer-complete-word
TAB             minibuffer-complete
C-j             minibuffer-complete-and-exit
RET             minibuffer-complete-and-exit
C-g             abort-recursive-edit
"

(substitute-command-keys
   "To abort a recursive edit from the minibuffer, type\
\\<minibuffer-local-must-match-map>\\[abort-recursive-edit].")
⇒ "To abort a recursive edit from the minibuffer, type C-g."

There are other special conventions for the text in documentation strings—for instance, you can refer to functions, variables, and sections of this manual. See section Tips for Documentation Strings, for details.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.4 Describing Characters for Help Messages

These functions convert events, key sequences, or characters to textual descriptions. These descriptions are useful for including arbitrary text characters or key sequences in messages, because they convert non-printing and whitespace characters to sequences of printing characters. The description of a non-whitespace printing character is the character itself.

Function: key-description sequence &optional prefix

This function returns a string containing the Emacs standard notation for the input events in sequence. If prefix is non-nil, it is a sequence of input events leading up to sequence and is included in the return value. Both arguments may be strings, vectors or lists. See section Input Events, for more information about valid events.

(key-description [?\M-3 delete])
     ⇒ "M-3 <delete>"
(key-description [delete] "\M-3")
     ⇒ "M-3 <delete>"

See also the examples for single-key-description, below.

Function: single-key-description event &optional no-angles

This function returns a string describing event in the standard Emacs notation for keyboard input. A normal printing character appears as itself, but a control character turns into a string starting with ‘C-’, a meta character turns into a string starting with ‘M-’, and space, tab, etc., appear as ‘SPC’, ‘TAB’, etc. A function key symbol appears inside angle brackets ‘<…>’. An event that is a list appears as the name of the symbol in the CAR of the list, inside angle brackets.

If the optional argument no-angles is non-nil, the angle brackets around function keys and event symbols are omitted; this is for compatibility with old versions of Emacs which didn’t use the brackets.

(single-key-description ?\C-x)
     ⇒ "C-x"
(key-description "\C-x \M-y \n \t \r \f123")
     ⇒ "C-x SPC M-y SPC C-j SPC TAB SPC RET SPC C-l 1 2 3"
(single-key-description 'delete)
     ⇒ "<delete>"
(single-key-description 'C-mouse-1)
     ⇒ "<C-mouse-1>"
(single-key-description 'C-mouse-1 t)
     ⇒ "C-mouse-1"
Function: text-char-description character

This function returns a string describing character in the standard Emacs notation for characters that appear in text—like single-key-description, except that control characters are represented with a leading caret (which is how control characters in Emacs buffers are usually displayed). Another difference is that text-char-description recognizes the 2**7 bit as the Meta character, whereas single-key-description uses the 2**27 bit for Meta.

(text-char-description ?\C-c)
     ⇒ "^C"
(text-char-description ?\M-m)
     ⇒ "\xed"
(text-char-description ?\C-\M-m)
     ⇒ "\x8d"
(text-char-description (+ 128 ?m))
     ⇒ "M-m"
(text-char-description (+ 128 ?\C-m))
     ⇒ "M-^M"
Command: read-kbd-macro string &optional need-vector

This function is used mainly for operating on keyboard macros, but it can also be used as a rough inverse for key-description. You call it with a string containing key descriptions, separated by spaces; it returns a string or vector containing the corresponding events. (This may or may not be a single valid key sequence, depending on what events you use; see section Key Sequences.) If need-vector is non-nil, the return value is always a vector.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.5 Help Functions

Emacs provides a variety of built-in help functions, all accessible to the user as subcommands of the prefix C-h. For more information about them, see Help in The GNU Emacs Manual. Here we describe some program-level interfaces to the same information.

Command: apropos pattern &optional do-all

This function finds all “meaningful” symbols whose names contain a match for the apropos pattern pattern. An apropos pattern is either a word to match, a space-separated list of words of which at least two must match, or a regular expression (if any special regular expression characters occur). A symbol is “meaningful” if it has a definition as a function, variable, or face, or has properties.

The function returns a list of elements that look like this:

(symbol score function-doc variable-doc
 plist-doc widget-doc face-doc group-doc)

Here, score is an integer measure of how important the symbol seems to be as a match. Each of the remaining elements is a documentation string, or nil, for symbol as a function, variable, etc.

It also displays the symbols in a buffer named *Apropos*, each with a one-line description taken from the beginning of its documentation string.

If do-all is non-nil, or if the user option apropos-do-all is non-nil, then apropos also shows key bindings for the functions that are found; it also shows all interned symbols, not just meaningful ones (and it lists them in the return value as well).

Variable: help-map

The value of this variable is a local keymap for characters following the Help key, C-h.

Prefix Command: help-command

This symbol is not a function; its function definition cell holds the keymap known as help-map. It is defined in help.el as follows:

(define-key global-map (string help-char) 'help-command)
(fset 'help-command help-map)
User Option: help-char

The value of this variable is the help character—the character that Emacs recognizes as meaning Help. By default, its value is 8, which stands for C-h. When Emacs reads this character, if help-form is a non-nil Lisp expression, it evaluates that expression, and displays the result in a window if it is a string.

Usually the value of help-form is nil. Then the help character has no special meaning at the level of command input, and it becomes part of a key sequence in the normal way. The standard key binding of C-h is a prefix key for several general-purpose help features.

The help character is special after prefix keys, too. If it has no binding as a subcommand of the prefix key, it runs describe-prefix-bindings, which displays a list of all the subcommands of the prefix key.

User Option: help-event-list

The value of this variable is a list of event types that serve as alternative “help characters”. These events are handled just like the event specified by help-char.

Variable: help-form

If this variable is non-nil, its value is a form to evaluate whenever the character help-char is read. If evaluating the form produces a string, that string is displayed.

A command that calls read-event, read-char-choice, or read-char probably should bind help-form to a non-nil expression while it does input. (The time when you should not do this is when C-h has some other meaning.) Evaluating this expression should result in a string that explains what the input is for and how to enter it properly.

Entry to the minibuffer binds this variable to the value of minibuffer-help-form (see Definition of minibuffer-help-form).

Variable: prefix-help-command

This variable holds a function to print help for a prefix key. The function is called when the user types a prefix key followed by the help character, and the help character has no binding after that prefix. The variable’s default value is describe-prefix-bindings.

Command: describe-prefix-bindings

This function calls describe-bindings to display a list of all the subcommands of the prefix key of the most recent key sequence. The prefix described consists of all but the last event of that key sequence. (The last event is, presumably, the help character.)

The following two functions are meant for modes that want to provide help without relinquishing control, such as the “electric” modes. Their names begin with ‘Helper’ to distinguish them from the ordinary help functions.

Command: Helper-describe-bindings

This command pops up a window displaying a help buffer containing a listing of all of the key bindings from both the local and global keymaps. It works by calling describe-bindings.

Command: Helper-help

This command provides help for the current mode. It prompts the user in the minibuffer with the message ‘Help (Type ? for further options)’, and then provides assistance in finding out what the key bindings are, and what the mode is intended for. It returns nil.

This can be customized by changing the map Helper-help-map.

Variable: data-directory

This variable holds the name of the directory in which Emacs finds certain documentation and text files that come with Emacs.

Function: help-buffer

This function returns the name of the help buffer, which is normally *Help*; if such a buffer does not exist, it is first created.

Macro: with-help-window buffer-name body…

This macro evaluates body like with-output-to-temp-buffer (see section Temporary Displays), inserting any output produced by its forms into a buffer named buffer-name. (Usually, buffer-name should be the value returned by the function help-buffer.) It also puts the specified buffer into Help mode and displays a message telling the user how to quit and scroll the help window. It selects the help window if the current value of the user option help-window-select has been set accordingly. It returns the last value in body.

Function: help-setup-xref item interactive-p

This function updates the cross reference data in the *Help* buffer, which is used to regenerate the help information when the user clicks on the ‘Back’ or ‘Forward’ buttons. Most commands that use the *Help* buffer should invoke this function before clearing the buffer. The item argument should have the form (function . args), where function is a function to call, with argument list args, to regenerate the help buffer. The interactive-p argument is non-nil if the calling command was invoked interactively; in that case, the stack of items for the *Help* buffer’s ‘Back’ buttons is cleared.

See describe-symbols example, for an example of using help-buffer, with-help-window, and help-setup-xref.

Macro: make-help-screen fname help-line help-text help-map

This macro defines a help command named fname that acts like a prefix key that shows a list of the subcommands it offers.

When invoked, fname displays help-text in a window, then reads and executes a key sequence according to help-map. The string help-text should describe the bindings available in help-map.

The command fname is defined to handle a few events itself, by scrolling the display of help-text. When fname reads one of those special events, it does the scrolling and then reads another event. When it reads an event that is not one of those few, and which has a binding in help-map, it executes that key’s binding and then returns.

The argument help-line should be a single-line summary of the alternatives in help-map. In the current version of Emacs, this argument is used only if you set the option three-step-help to t.

This macro is used in the command help-for-help which is the binding of C-h C-h.

User Option: three-step-help

If this variable is non-nil, commands defined with make-help-screen display their help-line strings in the echo area at first, and display the longer help-text strings only if the user types the help character again.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24 Files

This chapter describes the Emacs Lisp functions and variables to find, create, view, save, and otherwise work with files and directories. A few other file-related functions are described in Buffers, and those related to backups and auto-saving are described in Backups and Auto-Saving.

Many of the file functions take one or more arguments that are file names. A file name is a string. Most of these functions expand file name arguments using the function expand-file-name, so that ~ is handled correctly, as are relative file names (including ../). See section Functions that Expand Filenames.

In addition, certain magic file names are handled specially. For example, when a remote file name is specified, Emacs accesses the file over the network via an appropriate protocol. See Remote Files in The GNU Emacs Manual. This handling is done at a very low level, so you may assume that all the functions described in this chapter accept magic file names as file name arguments, except where noted. See section Making Certain File Names “Magic”, for details.

When file I/O functions signal Lisp errors, they usually use the condition file-error (see section Writing Code to Handle Errors). The error message is in most cases obtained from the operating system, according to locale system-messages-locale, and decoded using coding system locale-coding-system (see section Locales).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.1 Visiting Files

Visiting a file means reading a file into a buffer. Once this is done, we say that the buffer is visiting that file, and call the file “the visited file” of the buffer.

A file and a buffer are two different things. A file is information recorded permanently in the computer (unless you delete it). A buffer, on the other hand, is information inside of Emacs that will vanish at the end of the editing session (or when you kill the buffer). When a buffer is visiting a file, it contains information copied from the file. The copy in the buffer is what you modify with editing commands. Changes to the buffer do not change the file; to make the changes permanent, you must save the buffer, which means copying the altered buffer contents back into the file.

Despite the distinction between files and buffers, people often refer to a file when they mean a buffer and vice-versa. Indeed, we say, “I am editing a file”, rather than, “I am editing a buffer that I will soon save as a file of the same name”. Humans do not usually need to make the distinction explicit. When dealing with a computer program, however, it is good to keep the distinction in mind.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.1.1 Functions for Visiting Files

This section describes the functions normally used to visit files. For historical reasons, these functions have names starting with ‘find-’ rather than ‘visit-’. See section Buffer File Name, for functions and variables that access the visited file name of a buffer or that find an existing buffer by its visited file name.

In a Lisp program, if you want to look at the contents of a file but not alter it, the fastest way is to use insert-file-contents in a temporary buffer. Visiting the file is not necessary and takes longer. See section Reading from Files.

Command: find-file filename &optional wildcards

This command selects a buffer visiting the file filename, using an existing buffer if there is one, and otherwise creating a new buffer and reading the file into it. It also returns that buffer.

Aside from some technical details, the body of the find-file function is basically equivalent to:

(switch-to-buffer (find-file-noselect filename nil nil wildcards))

(See switch-to-buffer in Switching to a Buffer in a Window.)

If wildcards is non-nil, which is always true in an interactive call, then find-file expands wildcard characters in filename and visits all the matching files.

When find-file is called interactively, it prompts for filename in the minibuffer.

Command: find-file-literally filename

This command visits filename, like find-file does, but it does not perform any format conversions (see section File Format Conversion), character code conversions (see section Coding Systems), or end-of-line conversions (see section End of line conversion). The buffer visiting the file is made unibyte, and its major mode is Fundamental mode, regardless of the file name. File local variable specifications in the file (see section File Local Variables) are ignored, and automatic decompression and adding a newline at the end of the file due to require-final-newline (see section require-final-newline) are also disabled.

Note that if Emacs already has a buffer visiting the same file non-literally, it will not visit the same file literally, but instead just switch to the existing buffer. If you want to be sure of accessing a file’s contents literally, you should create a temporary buffer and then read the file contents into it using insert-file-contents-literally (see section Reading from Files).

Function: find-file-noselect filename &optional nowarn rawfile wildcards

This function is the guts of all the file-visiting functions. It returns a buffer visiting the file filename. You may make the buffer current or display it in a window if you wish, but this function does not do so.

The function returns an existing buffer if there is one; otherwise it creates a new buffer and reads the file into it. When find-file-noselect uses an existing buffer, it first verifies that the file has not changed since it was last visited or saved in that buffer. If the file has changed, this function asks the user whether to reread the changed file. If the user says ‘yes’, any edits previously made in the buffer are lost.

Reading the file involves decoding the file’s contents (see section Coding Systems), including end-of-line conversion, and format conversion (see section File Format Conversion). If wildcards is non-nil, then find-file-noselect expands wildcard characters in filename and visits all the matching files.

This function displays warning or advisory messages in various peculiar cases, unless the optional argument nowarn is non-nil. For example, if it needs to create a buffer, and there is no file named filename, it displays the message ‘(New file)’ in the echo area, and leaves the buffer empty.

The find-file-noselect function normally calls after-find-file after reading the file (see section Subroutines of Visiting). That function sets the buffer major mode, parses local variables, warns the user if there exists an auto-save file more recent than the file just visited, and finishes by running the functions in find-file-hook.

If the optional argument rawfile is non-nil, then after-find-file is not called, and the find-file-not-found-functions are not run in case of failure. What’s more, a non-nil rawfile value suppresses coding system conversion and format conversion.

The find-file-noselect function usually returns the buffer that is visiting the file filename. But, if wildcards are actually used and expanded, it returns a list of buffers that are visiting the various files.

(find-file-noselect "/etc/fstab")
     ⇒ #<buffer fstab>
Command: find-file-other-window filename &optional wildcards

This command selects a buffer visiting the file filename, but does so in a window other than the selected window. It may use another existing window or split a window; see Switching to a Buffer in a Window.

When this command is called interactively, it prompts for filename.

Command: find-file-read-only filename &optional wildcards

This command selects a buffer visiting the file filename, like find-file, but it marks the buffer as read-only. See section Read-Only Buffers, for related functions and variables.

When this command is called interactively, it prompts for filename.

User Option: find-file-wildcards

If this variable is non-nil, then the various find-file commands check for wildcard characters and visit all the files that match them (when invoked interactively or when their wildcards argument is non-nil). If this option is nil, then the find-file commands ignore their wildcards argument and never treat wildcard characters specially.

User Option: find-file-hook

The value of this variable is a list of functions to be called after a file is visited. The file’s local-variables specification (if any) will have been processed before the hooks are run. The buffer visiting the file is current when the hook functions are run.

This variable is a normal hook. See section Hooks.

Variable: find-file-not-found-functions

The value of this variable is a list of functions to be called when find-file or find-file-noselect is passed a nonexistent file name. find-file-noselect calls these functions as soon as it detects a nonexistent file. It calls them in the order of the list, until one of them returns non-nil. buffer-file-name is already set up.

This is not a normal hook because the values of the functions are used, and in many cases only some of the functions are called.

Variable: find-file-literally

This buffer-local variable, if set to a non-nil value, makes save-buffer behave as if the buffer were visiting its file literally, i.e., without conversions of any kind. The command find-file-literally sets this variable’s local value, but other equivalent functions and commands can do that as well, e.g., to avoid automatic addition of a newline at the end of the file. This variable is permanent local, so it is unaffected by changes of major modes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.1.2 Subroutines of Visiting

The find-file-noselect function uses two important subroutines which are sometimes useful in user Lisp code: create-file-buffer and after-find-file. This section explains how to use them.

Function: create-file-buffer filename

This function creates a suitably named buffer for visiting filename, and returns it. It uses filename (sans directory) as the name if that name is free; otherwise, it appends a string such as ‘<2>’ to get an unused name. See also Creating Buffers. Note that the uniquify library affects the result of this function. See Uniquify in The GNU Emacs Manual.

Please note: create-file-buffer does not associate the new buffer with a file and does not select the buffer. It also does not use the default major mode.

(create-file-buffer "foo")
     ⇒ #<buffer foo>
(create-file-buffer "foo")
     ⇒ #<buffer foo<2>>
(create-file-buffer "foo")
     ⇒ #<buffer foo<3>>

This function is used by find-file-noselect. It uses generate-new-buffer (see section Creating Buffers).

Function: after-find-file &optional error warn noauto after-find-file-from-revert-buffer nomodes

This function sets the buffer major mode, and parses local variables (see section How Emacs Chooses a Major Mode). It is called by find-file-noselect and by the default revert function (see section Reverting).

If reading the file got an error because the file does not exist, but its directory does exist, the caller should pass a non-nil value for error. In that case, after-find-file issues a warning: ‘(New file)’. For more serious errors, the caller should usually not call after-find-file.

If warn is non-nil, then this function issues a warning if an auto-save file exists and is more recent than the visited file.

If noauto is non-nil, that says not to enable or disable Auto-Save mode. The mode remains enabled if it was enabled before.

If after-find-file-from-revert-buffer is non-nil, that means this call was from revert-buffer. This has no direct effect, but some mode functions and hook functions check the value of this variable.

If nomodes is non-nil, that means don’t alter the buffer’s major mode, don’t process local variables specifications in the file, and don’t run find-file-hook. This feature is used by revert-buffer in some cases.

The last thing after-find-file does is call all the functions in the list find-file-hook.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.2 Saving Buffers

When you edit a file in Emacs, you are actually working on a buffer that is visiting that file—that is, the contents of the file are copied into the buffer and the copy is what you edit. Changes to the buffer do not change the file until you save the buffer, which means copying the contents of the buffer into the file.

Command: save-buffer &optional backup-option

This function saves the contents of the current buffer in its visited file if the buffer has been modified since it was last visited or saved. Otherwise it does nothing.

save-buffer is responsible for making backup files. Normally, backup-option is nil, and save-buffer makes a backup file only if this is the first save since visiting the file. Other values for backup-option request the making of backup files in other circumstances:

Command: save-some-buffers &optional save-silently-p pred

This command saves some modified file-visiting buffers. Normally it asks the user about each buffer. But if save-silently-p is non-nil, it saves all the file-visiting buffers without querying the user.

The optional pred argument controls which buffers to ask about (or to save silently if save-silently-p is non-nil). If it is nil, that means to ask only about file-visiting buffers. If it is t, that means also offer to save certain other non-file buffers—those that have a non-nil buffer-local value of buffer-offer-save (see section Killing Buffers). A user who says ‘yes’ to saving a non-file buffer is asked to specify the file name to use. The save-buffers-kill-emacs function passes the value t for pred.

If pred is neither t nor nil, then it should be a function of no arguments. It will be called in each buffer to decide whether to offer to save that buffer. If it returns a non-nil value in a certain buffer, that means do offer to save that buffer.

Command: write-file filename &optional confirm

This function writes the current buffer into file filename, makes the buffer visit that file, and marks it not modified. Then it renames the buffer based on filename, appending a string like ‘<2>’ if necessary to make a unique buffer name. It does most of this work by calling set-visited-file-name (see section Buffer File Name) and save-buffer.

If confirm is non-nil, that means to ask for confirmation before overwriting an existing file. Interactively, confirmation is required, unless the user supplies a prefix argument.

If filename is an existing directory, or a symbolic link to one, write-file uses the name of the visited file, in directory filename. If the buffer is not visiting a file, it uses the buffer name instead.

Saving a buffer runs several hooks. It also performs format conversion (see section File Format Conversion).

Variable: write-file-functions

The value of this variable is a list of functions to be called before writing out a buffer to its visited file. If one of them returns non-nil, the file is considered already written and the rest of the functions are not called, nor is the usual code for writing the file executed.

If a function in write-file-functions returns non-nil, it is responsible for making a backup file (if that is appropriate). To do so, execute the following code:

(or buffer-backed-up (backup-buffer))

You might wish to save the file modes value returned by backup-buffer and use that (if non-nil) to set the mode bits of the file that you write. This is what save-buffer normally does. See section Making Backup Files.

The hook functions in write-file-functions are also responsible for encoding the data (if desired): they must choose a suitable coding system and end-of-line conversion (see section Coding Systems in Lisp), perform the encoding (see section Explicit Encoding and Decoding), and set last-coding-system-used to the coding system that was used (see section Encoding and I/O).

If you set this hook locally in a buffer, it is assumed to be associated with the file or the way the contents of the buffer were obtained. Thus the variable is marked as a permanent local, so that changing the major mode does not alter a buffer-local value. On the other hand, calling set-visited-file-name will reset it. If this is not what you want, you might like to use write-contents-functions instead.

Even though this is not a normal hook, you can use add-hook and remove-hook to manipulate the list. See section Hooks.

Variable: write-contents-functions

This works just like write-file-functions, but it is intended for hooks that pertain to the buffer’s contents, not to the particular visited file or its location. Such hooks are usually set up by major modes, as buffer-local bindings for this variable. This variable automatically becomes buffer-local whenever it is set; switching to a new major mode always resets this variable, but calling set-visited-file-name does not.

If any of the functions in this hook returns non-nil, the file is considered already written and the rest are not called and neither are the functions in write-file-functions.

User Option: before-save-hook

This normal hook runs before a buffer is saved in its visited file, regardless of whether that is done normally or by one of the hooks described above. For instance, the copyright.el program uses this hook to make sure the file you are saving has the current year in its copyright notice.

User Option: after-save-hook

This normal hook runs after a buffer has been saved in its visited file. One use of this hook is in Fast Lock mode; it uses this hook to save the highlighting information in a cache file.

User Option: file-precious-flag

If this variable is non-nil, then save-buffer protects against I/O errors while saving by writing the new file to a temporary name instead of the name it is supposed to have, and then renaming it to the intended name after it is clear there are no errors. This procedure prevents problems such as a lack of disk space from resulting in an invalid file.

As a side effect, backups are necessarily made by copying. See section Backup by Renaming or by Copying?. Yet, at the same time, saving a precious file always breaks all hard links between the file you save and other file names.

Some modes give this variable a non-nil buffer-local value in particular buffers.

User Option: require-final-newline

This variable determines whether files may be written out that do not end with a newline. If the value of the variable is t, then save-buffer silently adds a newline at the end of the buffer whenever it does not already end in one. If the value is visit, Emacs adds a missing newline just after it visits the file. If the value is visit-save, Emacs adds a missing newline both on visiting and on saving. For any other non-nil value, save-buffer asks the user whether to add a newline each time the case arises.

If the value of the variable is nil, then save-buffer doesn’t add newlines at all. nil is the default value, but a few major modes set it to t in particular buffers.

See also the function set-visited-file-name (see section Buffer File Name).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.3 Reading from Files

To copy the contents of a file into a buffer, use the function insert-file-contents. (Don’t use the command insert-file in a Lisp program, as that sets the mark.)

Function: insert-file-contents filename &optional visit beg end replace

This function inserts the contents of file filename into the current buffer after point. It returns a list of the absolute file name and the length of the data inserted. An error is signaled if filename is not the name of a file that can be read.

This function checks the file contents against the defined file formats, and converts the file contents if appropriate and also calls the functions in the list after-insert-file-functions. See section File Format Conversion. Normally, one of the functions in the after-insert-file-functions list determines the coding system (see section Coding Systems) used for decoding the file’s contents, including end-of-line conversion. However, if the file contains null bytes, it is by default visited without any code conversions. See section inhibit-null-byte-detection.

If visit is non-nil, this function additionally marks the buffer as unmodified and sets up various fields in the buffer so that it is visiting the file filename: these include the buffer’s visited file name and its last save file modtime. This feature is used by find-file-noselect and you probably should not use it yourself.

If beg and end are non-nil, they should be numbers that are byte offsets specifying the portion of the file to insert. In this case, visit must be nil. For example,

(insert-file-contents filename nil 0 500)

inserts the first 500 characters of a file.

If the argument replace is non-nil, it means to replace the contents of the buffer (actually, just the accessible portion) with the contents of the file. This is better than simply deleting the buffer contents and inserting the whole file, because (1) it preserves some marker positions and (2) it puts less data in the undo list.

It is possible to read a special file (such as a FIFO or an I/O device) with insert-file-contents, as long as replace and visit are nil.

Function: insert-file-contents-literally filename &optional visit beg end replace

This function works like insert-file-contents except that it does not run find-file-hook, and does not do format decoding, character code conversion, automatic uncompression, and so on.

If you want to pass a file name to another process so that another program can read the file, use the function file-local-copy; see Making Certain File Names “Magic”.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.4 Writing to Files

You can write the contents of a buffer, or part of a buffer, directly to a file on disk using the append-to-file and write-region functions. Don’t use these functions to write to files that are being visited; that could cause confusion in the mechanisms for visiting.

Command: append-to-file start end filename

This function appends the contents of the region delimited by start and end in the current buffer to the end of file filename. If that file does not exist, it is created. This function returns nil.

An error is signaled if filename specifies a nonwritable file, or a nonexistent file in a directory where files cannot be created.

When called from Lisp, this function is completely equivalent to:

(write-region start end filename t)
Command: write-region start end filename &optional append visit lockname mustbenew

This function writes the region delimited by start and end in the current buffer into the file specified by filename.

If start is nil, then the command writes the entire buffer contents (not just the accessible portion) to the file and ignores end.

If start is a string, then write-region writes or appends that string, rather than text from the buffer. end is ignored in this case.

If append is non-nil, then the specified text is appended to the existing file contents (if any). If append is a number, write-region seeks to that byte offset from the start of the file and writes the data from there.

If mustbenew is non-nil, then write-region asks for confirmation if filename names an existing file. If mustbenew is the symbol excl, then write-region does not ask for confirmation, but instead it signals an error file-already-exists if the file already exists.

The test for an existing file, when mustbenew is excl, uses a special system feature. At least for files on a local disk, there is no chance that some other program could create a file of the same name before Emacs does, without Emacs’s noticing.

If visit is t, then Emacs establishes an association between the buffer and the file: the buffer is then visiting that file. It also sets the last file modification time for the current buffer to filename’s modtime, and marks the buffer as not modified. This feature is used by save-buffer, but you probably should not use it yourself.

If visit is a string, it specifies the file name to visit. This way, you can write the data to one file (filename) while recording the buffer as visiting another file (visit). The argument visit is used in the echo area message and also for file locking; visit is stored in buffer-file-name. This feature is used to implement file-precious-flag; don’t use it yourself unless you really know what you’re doing.

The optional argument lockname, if non-nil, specifies the file name to use for purposes of locking and unlocking, overriding filename and visit for that purpose.

The function write-region converts the data which it writes to the appropriate file formats specified by buffer-file-format and also calls the functions in the list write-region-annotate-functions. See section File Format Conversion.

Normally, write-region displays the message ‘Wrote filename’ in the echo area. If visit is neither t nor nil nor a string, then this message is inhibited. This feature is useful for programs that use files for internal purposes, files that the user does not need to know about.

Macro: with-temp-file file body…

The with-temp-file macro evaluates the body forms with a temporary buffer as the current buffer; then, at the end, it writes the buffer contents into file file. It kills the temporary buffer when finished, restoring the buffer that was current before the with-temp-file form. Then it returns the value of the last form in body.

The current buffer is restored even in case of an abnormal exit via throw or error (see section Nonlocal Exits).

See also with-temp-buffer in The Current Buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.5 File Locks

When two users edit the same file at the same time, they are likely to interfere with each other. Emacs tries to prevent this situation from arising by recording a file lock when a file is being modified. Emacs can then detect the first attempt to modify a buffer visiting a file that is locked by another Emacs job, and ask the user what to do. The file lock is really a file, a symbolic link with a special name, stored in the same directory as the file you are editing. (On file systems that do not support symbolic links, a regular file is used.)

When you access files using NFS, there may be a small probability that you and another user will both lock the same file “simultaneously”. If this happens, it is possible for the two users to make changes simultaneously, but Emacs will still warn the user who saves second. Also, the detection of modification of a buffer visiting a file changed on disk catches some cases of simultaneous editing; see Buffer Modification Time.

Function: file-locked-p filename

This function returns nil if the file filename is not locked. It returns t if it is locked by this Emacs process, and it returns the name of the user who has locked it if it is locked by some other job.

(file-locked-p "foo")
     ⇒ nil
Function: lock-buffer &optional filename

This function locks the file filename, if the current buffer is modified. The argument filename defaults to the current buffer’s visited file. Nothing is done if the current buffer is not visiting a file, or is not modified, or if the system does not support locking.

Function: unlock-buffer

This function unlocks the file being visited in the current buffer, if the buffer is modified. If the buffer is not modified, then the file should not be locked, so this function does nothing. It also does nothing if the current buffer is not visiting a file, or if the system does not support locking.

User Option: create-lockfiles

If this variable is nil, Emacs does not lock files.

Function: ask-user-about-lock file other-user

This function is called when the user tries to modify file, but it is locked by another user named other-user. The default definition of this function asks the user to say what to do. The value this function returns determines what Emacs does next:

If you wish, you can replace the ask-user-about-lock function with your own version that makes the decision in another way.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6 Information about Files

This section describes the functions for retrieving various types of information about files (or directories or symbolic links), such as whether a file is readable or writable, and its size. These functions all take arguments which are file names. Except where noted, these arguments need to specify existing files, or an error is signaled.

Be careful with file names that end in spaces. On some filesystems (notably, MS-Windows), trailing whitespace characters in file names are silently and automatically ignored.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.1 Testing Accessibility

These functions test for permission to access a file for reading, writing, or execution. Unless explicitly stated otherwise, they recursively follow symbolic links for their file name arguments, at all levels (at the level of the file itself and at all levels of parent directories).

On some operating systems, more complex sets of access permissions can be specified, via mechanisms such as Access Control Lists (ACLs). See section Extended File Attributes, for how to query and set those permissions.

Function: file-exists-p filename

This function returns t if a file named filename appears to exist. This does not mean you can necessarily read the file, only that you can find out its attributes. (On Unix and GNU/Linux, this is true if the file exists and you have execute permission on the containing directories, regardless of the permissions of the file itself.)

If the file does not exist, or if access control policies prevent you from finding its attributes, this function returns nil.

Directories are files, so file-exists-p returns t when given a directory name. However, symbolic links are treated specially; file-exists-p returns t for a symbolic link name only if the target file exists.

Function: file-readable-p filename

This function returns t if a file named filename exists and you can read it. It returns nil otherwise.

Function: file-executable-p filename

This function returns t if a file named filename exists and you can execute it. It returns nil otherwise. On Unix and GNU/Linux, if the file is a directory, execute permission means you can check the existence and attributes of files inside the directory, and open those files if their modes permit.

Function: file-writable-p filename

This function returns t if the file filename can be written or created by you, and nil otherwise. A file is writable if the file exists and you can write it. It is creatable if it does not exist, but the specified directory does exist and you can write in that directory.

In the example below, foo is not writable because the parent directory does not exist, even though the user could create such a directory.

(file-writable-p "~/no-such-dir/foo")
     ⇒ nil
Function: file-accessible-directory-p dirname

This function returns t if you have permission to open existing files in the directory whose name as a file is dirname; otherwise (or if there is no such directory), it returns nil. The value of dirname may be either a directory name (such as /foo/) or the file name of a file which is a directory (such as /foo, without the final slash).

For example, from the following we deduce that any attempt to read a file in /foo/ will give an error:

(file-accessible-directory-p "/foo")
     ⇒ nil
Function: access-file filename string

This function opens file filename for reading, then closes it and returns nil. However, if the open fails, it signals an error using string as the error message text.

Function: file-ownership-preserved-p filename &optional group

This function returns t if deleting the file filename and then creating it anew would keep the file’s owner unchanged. It also returns t for nonexistent files.

If the optional argument group is non-nil, this function also checks that the file’s group would be unchanged.

If filename is a symbolic link, then, unlike the other functions discussed here, file-ownership-preserved-p does not replace filename with its target. However, it does recursively follow symbolic links at all levels of parent directories.

Function: file-modes filename

This function returns the mode bits of filename—an integer summarizing its read, write, and execution permissions. Symbolic links in filename are recursively followed at all levels. If the file does not exist, the return value is nil.

See File permissions in The GNU Coreutils Manual, for a description of mode bits. For example, if the low-order bit is 1, the file is executable by all users; if the second-lowest-order bit is 1, the file is writable by all users; etc. The highest possible value is 4095 (7777 octal), meaning that everyone has read, write, and execute permission, the SUID bit is set for both others and group, and the sticky bit is set.

See section Changing File Names and Attributes, for the set-file-modes function, which can be used to set these permissions.

(file-modes "~/junk/diffs")
     ⇒ 492               ; Decimal integer.
(format "%o" 492)
     ⇒ "754"             ; Convert to octal.
(set-file-modes "~/junk/diffs" #o666)
     ⇒ nil
$ ls -l diffs
-rw-rw-rw- 1 lewis lewis 3063 Oct 30 16:00 diffs

MS-DOS note: On MS-DOS, there is no such thing as an “executable” file mode bit. So file-modes considers a file executable if its name ends in one of the standard executable extensions, such as .com, .bat, .exe, and some others. Files that begin with the Unix-standard ‘#!’ signature, such as shell and Perl scripts, are also considered executable. Directories are also reported as executable, for compatibility with Unix. These conventions are also followed by file-attributes (see section File Attributes).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.2 Distinguishing Kinds of Files

This section describes how to distinguish various kinds of files, such as directories, symbolic links, and ordinary files.

Function: file-symlink-p filename

If the file filename is a symbolic link, the file-symlink-p function returns its (non-recursive) link target as a string. (The link target string is not necessarily the full absolute file name of the target; determining the full file name that the link points to is nontrivial, see below.) If the leading directories of filename include symbolic links, this function recursively follows them.

If the file filename is not a symbolic link, or does not exist, file-symlink-p returns nil.

Here are a few examples of using this function:

(file-symlink-p "not-a-symlink")
     ⇒ nil
(file-symlink-p "sym-link")
     ⇒ "not-a-symlink"
(file-symlink-p "sym-link2")
     ⇒ "sym-link"
(file-symlink-p "/bin")
     ⇒ "/pub/bin"

Note that in the third example, the function returned sym-link, but did not proceed to resolve it, although that file is itself a symbolic link. This is what we meant by “non-recursive” above—the process of following the symbolic links does not recurse if the link target is itself a link.

The string that this function returns is what is recorded in the symbolic link; it may or may not include any leading directories. This function does not expand the link target to produce a fully-qualified file name, and in particular does not use the leading directories, if any, of the filename argument if the link target is not an absolute file name. Here’s an example:

(file-symlink-p "/foo/bar/baz")
     ⇒ "some-file"

Here, although /foo/bar/baz was given as a fully-qualified file name, the result is not, and in fact does not have any leading directories at all. And since some-file might itself be a symbolic link, you cannot simply prepend leading directories to it, nor even naively use expand-file-name (see section Functions that Expand Filenames) to produce its absolute file name.

For this reason, this function is seldom useful if you need to determine more than just the fact that a file is or isn’t a symbolic link. If you actually need the file name of the link target, use file-chase-links or file-truename, described in Truenames.

The next two functions recursively follow symbolic links at all levels for filename.

Function: file-directory-p filename

This function returns t if filename is the name of an existing directory, nil otherwise.

(file-directory-p "~rms")
     ⇒ t
(file-directory-p "~rms/lewis/files.texi")
     ⇒ nil
(file-directory-p "~rms/lewis/no-such-file")
     ⇒ nil
(file-directory-p "$HOME")
     ⇒ nil
(file-directory-p
 (substitute-in-file-name "$HOME"))
     ⇒ t
Function: file-regular-p filename

This function returns t if the file filename exists and is a regular file (not a directory, named pipe, terminal, or other I/O device).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.3 Truenames

The truename of a file is the name that you get by following symbolic links at all levels until none remain, then simplifying away ‘.’ and ‘..’ appearing as name components. This results in a sort of canonical name for the file. A file does not always have a unique truename; the number of distinct truenames a file has is equal to the number of hard links to the file. However, truenames are useful because they eliminate symbolic links as a cause of name variation.

Function: file-truename filename

This function returns the truename of the file filename. If the argument is not an absolute file name, this function first expands it against default-directory.

This function does not expand environment variables. Only substitute-in-file-name does that. See Definition of substitute-in-file-name.

If you may need to follow symbolic links preceding ‘..’ appearing as a name component, call file-truename without prior direct or indirect calls to expand-file-name. Otherwise, the file name component immediately preceding ‘..’ will be “simplified away” before file-truename is called. To eliminate the need for a call to expand-file-name, file-truename handles ‘~’ in the same way that expand-file-name does. See section Functions that Expand Filenames.

Function: file-chase-links filename &optional limit

This function follows symbolic links, starting with filename, until it finds a file name which is not the name of a symbolic link. Then it returns that file name. This function does not follow symbolic links at the level of parent directories.

If you specify a number for limit, then after chasing through that many links, the function just returns what it has even if that is still a symbolic link.

To illustrate the difference between file-chase-links and file-truename, suppose that /usr/foo is a symbolic link to the directory /home/foo, and /home/foo/hello is an ordinary file (or at least, not a symbolic link) or nonexistent. Then we would have:

(file-chase-links "/usr/foo/hello")
     ;; This does not follow the links in the parent directories.
     ⇒ "/usr/foo/hello"
(file-truename "/usr/foo/hello")
     ;; Assuming that /home is not a symbolic link.
     ⇒ "/home/foo/hello"
Function: file-equal-p file1 file2

This function returns t if the files file1 and file2 name the same file. This is similar to comparing their truenames, except that remote file names are also handled in an appropriate manner. If file1 or file2 does not exist, the return value is unspecified.

Function: file-in-directory-p file dir

This function returns t if file is a file in directory dir, or in a subdirectory of dir. It also returns t if file and dir are the same directory. It compares the truenames of the two directories. If dir does not name an existing directory, the return value is nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.4 File Attributes

This section describes the functions for getting detailed information about a file, including the owner and group numbers, the number of names, the inode number, the size, and the times of access and modification.

Function: file-newer-than-file-p filename1 filename2

This function returns t if the file filename1 is newer than file filename2. If filename1 does not exist, it returns nil. If filename1 does exist, but filename2 does not, it returns t.

In the following example, assume that the file aug-19 was written on the 19th, aug-20 was written on the 20th, and the file no-file doesn’t exist at all.

(file-newer-than-file-p "aug-19" "aug-20")
     ⇒ nil
(file-newer-than-file-p "aug-20" "aug-19")
     ⇒ t
(file-newer-than-file-p "aug-19" "no-file")
     ⇒ t
(file-newer-than-file-p "no-file" "aug-19")
     ⇒ nil

If the filename argument to the next two functions is a symbolic link, then these function do not replace it with its target. However, they both recursively follow symbolic links at all levels of parent directories.

Function: file-attributes filename &optional id-format

This function returns a list of attributes of file filename. If the specified file cannot be opened, it returns nil. The optional parameter id-format specifies the preferred format of attributes UID and GID (see below)—the valid values are 'string and 'integer. The latter is the default, but we plan to change that, so you should specify a non-nil value for id-format if you use the returned UID or GID.

The elements of the list, in order, are:

  1. t for a directory, a string for a symbolic link (the name linked to), or nil for a text file.
  2. The number of names the file has. Alternate names, also known as hard links, can be created by using the add-name-to-file function (see section Changing File Names and Attributes).
  3. The file’s UID, normally as a string. However, if it does not correspond to a named user, the value is a number.
  4. The file’s GID, likewise.
  5. The time of last access, as a list of four integers (sec-high sec-low microsec picosec). (This is similar to the value of current-time; see Time of Day.) Note that on some FAT-based filesystems, only the date of last access is recorded, so this time will always hold the midnight of the day of last access.
  6. The time of last modification as a list of four integers (as above). This is the last time when the file’s contents were modified.
  7. The time of last status change as a list of four integers (as above). This is the time of the last change to the file’s access mode bits, its owner and group, and other information recorded in the filesystem for the file, beyond the file’s contents.
  8. The size of the file in bytes. This is floating point if the size is too large to fit in a Lisp integer.
  9. The file’s modes, as a string of ten letters or dashes, as in ‘ls -l’.
  10. An unspecified value, present for backward compatibility.
  11. The file’s inode number. If possible, this is an integer. If the inode number is too large to be represented as an integer in Emacs Lisp but dividing it by 2^{16} yields a representable integer, then the value has the form (high . low), where low holds the low 16 bits. If the inode number is too wide for even that, the value is of the form (high middle . low), where high holds the high bits, middle the middle 24 bits, and low the low 16 bits.
  12. The filesystem number of the device that the file is on. Depending on the magnitude of the value, this can be either an integer or a cons cell, in the same manner as the inode number. This element and the file’s inode number together give enough information to distinguish any two files on the system—no two files can have the same values for both of these numbers.

For example, here are the file attributes for files.texi:

(file-attributes "files.texi" 'string)
     ⇒  (nil 1 "lh" "users"
          (20614 64019 50040 152000)
          (20000 23 0 0)
          (20614 64555 902289 872000)
          122295 "-rw-rw-rw-"
          t (5888 2 . 43978)
          (15479 . 46724))

and here is how the result is interpreted:

nil

is neither a directory nor a symbolic link.

1

has only one name (the name files.texi in the current default directory).

"lh"

is owned by the user with name "lh".

"users"

is in the group with name "users".

(20614 64019 50040 152000)

was last accessed on October 23, 2012, at 20:12:03.050040152 UTC.

(20000 23 0 0)

was last modified on July 15, 2001, at 08:53:43 UTC.

(20614 64555 902289 872000)

last had its status changed on October 23, 2012, at 20:20:59.902289872 UTC.

122295

is 122295 bytes long. (It may not contain 122295 characters, though, if some of the bytes belong to multibyte sequences, and also if the end-of-line format is CR-LF.)

"-rw-rw-rw-"

has a mode of read and write access for the owner, group, and world.

t

is merely a placeholder; it carries no information.

(5888 2 . 43978)

has an inode number of 6473924464520138.

(15479 . 46724)

is on the file-system device whose number is 1014478468.

Function: file-nlinks filename

This function returns the number of names (i.e., hard links) that file filename has. If the file does not exist, this function returns nil. Note that symbolic links have no effect on this function, because they are not considered to be names of the files they link to.

$ ls -l foo*
-rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo
-rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo1
(file-nlinks "foo")
     ⇒ 2
(file-nlinks "doesnt-exist")
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.5 Extended File Attributes

On some operating systems, each file can be associated with arbitrary extended file attributes. At present, Emacs supports querying and setting two specific sets of extended file attributes: Access Control Lists (ACLs) and SELinux contexts. These extended file attributes are used, on some systems, to impose more sophisticated file access controls than the basic “Unix-style” permissions discussed in the previous sections.

A detailed explanation of ACLs and SELinux is beyond the scope of this manual. For our purposes, each file can be associated with an ACL, which specifies its properties under an ACL-based file control system, and/or an SELinux context, which specifies its properties under the SELinux system.

Function: file-acl filename

This function returns the ACL for the file filename. The exact Lisp representation of the ACL is unspecified (and may change in future Emacs versions), but it is the same as what set-file-acl takes for its acl argument (see section Changing File Names and Attributes).

The underlying ACL implementation is platform-specific; on GNU/Linux and BSD, Emacs uses the POSIX ACL interface, while on MS-Windows Emacs emulates the POSIX ACL interface with native file security APIs.

If Emacs was not compiled with ACL support, or the file does not exist or is inaccessible, or Emacs was unable to determine the ACL entries for any other reason, then the return value is nil.

Function: file-selinux-context filename

This function returns the SELinux context of the file filename, as a list of the form (user role type range). The list elements are the context’s user, role, type, and range respectively, as Lisp strings; see the SELinux documentation for details about what these actually mean. The return value has the same form as what set-file-selinux-context takes for its context argument (see section Changing File Names and Attributes).

If Emacs was not compiled with SELinux support, or the file does not exist or is inaccessible, or if the system does not support SELinux, then the return value is (nil nil nil nil).

Function: file-extended-attributes filename

This function returns an alist of the Emacs-recognized extended attributes of file filename. Currently, it serves as a convenient way to retrieve both the ACL and SELinux context; you can then call the function set-file-extended-attributes, with the returned alist as its second argument, to apply the same file access attributes to another file (see section Changing File Names and Attributes).

One of the elements is (acl . acl), where acl has the same form returned by file-acl.

Another element is (selinux-context . context), where context is the SELinux context, in the same form returned by file-selinux-context.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.6 Locating Files in Standard Places

This section explains how to search for a file in a list of directories (a path), or for an executable file in the standard list of executable file directories.

To search for a user-specific configuration file, See section Standard File Names, for the locate-user-emacs-file function.

Function: locate-file filename path &optional suffixes predicate

This function searches for a file whose name is filename in a list of directories given by path, trying the suffixes in suffixes. If it finds such a file, it returns the file’s absolute file name (see section Absolute and Relative File Names); otherwise it returns nil.

The optional argument suffixes gives the list of file-name suffixes to append to filename when searching. locate-file tries each possible directory with each of these suffixes. If suffixes is nil, or (""), then there are no suffixes, and filename is used only as-is. Typical values of suffixes are exec-suffixes (see section Functions that Create Subprocesses), load-suffixes, load-file-rep-suffixes and the return value of the function get-load-suffixes (see section Load Suffixes).

Typical values for path are exec-path (see section Functions that Create Subprocesses) when looking for executable programs, or load-path (see section Library Search) when looking for Lisp files. If filename is absolute, path has no effect, but the suffixes in suffixes are still tried.

The optional argument predicate, if non-nil, specifies a predicate function for testing whether a candidate file is suitable. The predicate is passed the candidate file name as its single argument. If predicate is nil or omitted, locate-file uses file-readable-p as the predicate. See section Distinguishing Kinds of Files, for other useful predicates, e.g., file-executable-p and file-directory-p.

For compatibility, predicate can also be one of the symbols executable, readable, writable, exists, or a list of one or more of these symbols.

Function: executable-find program

This function searches for the executable file of the named program and returns the absolute file name of the executable, including its file-name extensions, if any. It returns nil if the file is not found. The functions searches in all the directories in exec-path, and tries all the file-name extensions in exec-suffixes (see section Functions that Create Subprocesses).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.7 Changing File Names and Attributes

The functions in this section rename, copy, delete, link, and set the modes (permissions) of files.

In the functions that have an argument newname, if a file by the name of newname already exists, the actions taken depend on the value of the argument ok-if-already-exists:

The next four commands all recursively follow symbolic links at all levels of parent directories for their first argument, but, if that argument is itself a symbolic link, then only copy-file replaces it with its (recursive) target.

Command: add-name-to-file oldname newname &optional ok-if-already-exists

This function gives the file named oldname the additional name newname. This means that newname becomes a new “hard link” to oldname.

In the first part of the following example, we list two files, foo and foo3.

$ ls -li fo*
81908 -rw-rw-rw- 1 rms rms 29 Aug 18 20:32 foo
84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3

Now we create a hard link, by calling add-name-to-file, then list the files again. This shows two names for one file, foo and foo2.

(add-name-to-file "foo" "foo2")
     ⇒ nil
$ ls -li fo*
81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo
81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo2
84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3

Finally, we evaluate the following:

(add-name-to-file "foo" "foo3" t)

and list the files again. Now there are three names for one file: foo, foo2, and foo3. The old contents of foo3 are lost.

(add-name-to-file "foo1" "foo3")
     ⇒ nil
$ ls -li fo*
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo2
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo3

This function is meaningless on operating systems where multiple names for one file are not allowed. Some systems implement multiple names by copying the file instead.

See also file-nlinks in File Attributes.

Command: rename-file filename newname &optional ok-if-already-exists

This command renames the file filename as newname.

If filename has additional names aside from filename, it continues to have those names. In fact, adding the name newname with add-name-to-file and then deleting filename has the same effect as renaming, aside from momentary intermediate states.

Command: copy-file oldname newname &optional ok-if-exists time preserve-uid-gid preserve-extended-attributes

This command copies the file oldname to newname. An error is signaled if oldname does not exist. If newname names a directory, it copies oldname into that directory, preserving its final name component.

If time is non-nil, then this function gives the new file the same last-modified time that the old one has. (This works on only some operating systems.) If setting the time gets an error, copy-file signals a file-date-error error. In an interactive call, a prefix argument specifies a non-nil value for time.

If argument preserve-uid-gid is nil, we let the operating system decide the user and group ownership of the new file (this is usually set to the user running Emacs). If preserve-uid-gid is non-nil, we attempt to copy the user and group ownership of the file. This works only on some operating systems, and only if you have the correct permissions to do so.

If the optional argument preserve-permissions is non-nil, this function copies the file modes (or “permissions”) of oldname to newname, as well as the Access Control List and SELinux context (if any). See section Information about Files.

Otherwise, the file modes of newname are left unchanged if it is an existing file, and set to those of oldname, masked by the default file permissions (see set-default-file-modes below), if newname is to be newly created. The Access Control List or SELinux context are not copied over in either case.

Command: make-symbolic-link filename newname &optional ok-if-exists

This command makes a symbolic link to filename, named newname. This is like the shell command ‘ln -s filename newname’.

This function is not available on systems that don’t support symbolic links.

Command: delete-file filename &optional trash

This command deletes the file filename. If the file has multiple names, it continues to exist under the other names. If filename is a symbolic link, delete-file deletes only the symbolic link and not its target (though it does follow symbolic links at all levels of parent directories).

A suitable kind of file-error error is signaled if the file does not exist, or is not deletable. (On Unix and GNU/Linux, a file is deletable if its directory is writable.)

If the optional argument trash is non-nil and the variable delete-by-moving-to-trash is non-nil, this command moves the file into the system Trash instead of deleting it. See Miscellaneous File Operations in The GNU Emacs Manual. When called interactively, trash is t if no prefix argument is given, and nil otherwise.

See also delete-directory in Creating, Copying and Deleting Directories.

Command: set-file-modes filename mode

This function sets the file mode (or permissions) of filename to mode. It recursively follows symbolic links at all levels for filename.

If called non-interactively, mode must be an integer. Only the lowest 12 bits of the integer are used; on most systems, only the lowest 9 bits are meaningful. You can use the Lisp construct for octal numbers to enter mode. For example,

(set-file-modes #o644)

specifies that the file should be readable and writable for its owner, readable for group members, and readable for all other users. See File permissions in The GNU Coreutils Manual, for a description of mode bit specifications.

Interactively, mode is read from the minibuffer using read-file-modes (see below), which lets the user type in either an integer or a string representing the permissions symbolically.

See section File Attributes, for the function file-modes, which returns the permissions of a file.

Function: set-default-file-modes mode

This function sets the default permissions for new files created by Emacs and its subprocesses. Every file created with Emacs initially has these permissions, or a subset of them (write-region will not grant execute permissions even if the default file permissions allow execution). On Unix and GNU/Linux, the default permissions are given by the bitwise complement of the “umask” value.

The argument mode should be an integer which specifies the permissions, similar to set-file-modes above. Only the lowest 9 bits are meaningful.

The default file permissions have no effect when you save a modified version of an existing file; saving a file preserves its existing permissions.

Function: default-file-modes

This function returns the default file permissions, as an integer.

Function: read-file-modes &optional prompt base-file

This function reads a set of file mode bits from the minibuffer. The first optional argument prompt specifies a non-default prompt. Second second optional argument base-file is the name of a file on whose permissions to base the mode bits that this function returns, if what the user types specifies mode bits relative to permissions of an existing file.

If user input represents an octal number, this function returns that number. If it is a complete symbolic specification of mode bits, as in "u=rwx", the function converts it to the equivalent numeric value using file-modes-symbolic-to-number and returns the result. If the specification is relative, as in "o+g", then the permissions on which the specification is based are taken from the mode bits of base-file. If base-file is omitted or nil, the function uses 0 as the base mode bits. The complete and relative specifications can be combined, as in "u+r,g+rx,o+r,g-w". See File permissions in The GNU Coreutils Manual, for a description of file mode specifications.

Function: file-modes-symbolic-to-number modes &optional base-modes

This function converts a symbolic file mode specification in modes into the equivalent integer. If the symbolic specification is based on an existing file, that file’s mode bits are taken from the optional argument base-modes; if that argument is omitted or nil, it defaults to 0, i.e., no access rights at all.

Function: set-file-times filename &optional time

This function sets the access and modification times of filename to time. The return value is t if the times are successfully set, otherwise it is nil. time defaults to the current time and must be in the format returned by current-time (see section Time of Day).

Function: set-file-extended-attributes filename attribute-alist

This function sets the Emacs-recognized extended file attributes for filename. The second argument attribute-alist should be an alist of the same form returned by file-extended-attributes. See section Extended File Attributes.

Function: set-file-selinux-context filename context

This function sets the SELinux security context for filename to context. The context argument should be a list (user role type range), where each element is a string. See section Extended File Attributes.

The function returns t if it succeeds in setting the SELinux context of filename. It returns nil if the context was not set (e.g., if SELinux is disabled, or if Emacs was compiled without SELinux support).

Function: set-file-acl filename acl

This function sets the Access Control List for filename to acl. The acl argument should have the same form returned by the function file-acl. See section Extended File Attributes.

The function returns t if it successfully sets the ACL of filename, nil otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8 File Names

Files are generally referred to by their names, in Emacs as elsewhere. File names in Emacs are represented as strings. The functions that operate on a file all expect a file name argument.

In addition to operating on files themselves, Emacs Lisp programs often need to operate on file names; i.e., to take them apart and to use part of a name to construct related file names. This section describes how to manipulate file names.

The functions in this section do not actually access files, so they can operate on file names that do not refer to an existing file or directory.

On MS-DOS and MS-Windows, these functions (like the function that actually operate on files) accept MS-DOS or MS-Windows file-name syntax, where backslashes separate the components, as well as Unix syntax; but they always return Unix syntax. This enables Lisp programs to specify file names in Unix syntax and work properly on all systems without change.13


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.1 File Name Components

The operating system groups files into directories. To specify a file, you must specify the directory and the file’s name within that directory. Therefore, Emacs considers a file name as having two main parts: the directory name part, and the nondirectory part (or file name within the directory). Either part may be empty. Concatenating these two parts reproduces the original file name.

On most systems, the directory part is everything up to and including the last slash (backslash is also allowed in input on MS-DOS or MS-Windows); the nondirectory part is the rest.

For some purposes, the nondirectory part is further subdivided into the name proper and the version number. On most systems, only backup files have version numbers in their names.

Function: file-name-directory filename

This function returns the directory part of filename, as a directory name (see section Directory Names), or nil if filename does not include a directory part.

On GNU and Unix systems, a string returned by this function always ends in a slash. On MS-DOS it can also end in a colon.

(file-name-directory "lewis/foo")  ; Unix example
     ⇒ "lewis/"
(file-name-directory "foo")        ; Unix example
     ⇒ nil
Function: file-name-nondirectory filename

This function returns the nondirectory part of filename.

(file-name-nondirectory "lewis/foo")
     ⇒ "foo"
(file-name-nondirectory "foo")
     ⇒ "foo"
(file-name-nondirectory "lewis/")
     ⇒ ""
Function: file-name-sans-versions filename &optional keep-backup-version

This function returns filename with any file version numbers, backup version numbers, or trailing tildes discarded.

If keep-backup-version is non-nil, then true file version numbers understood as such by the file system are discarded from the return value, but backup version numbers are kept.

(file-name-sans-versions "~rms/foo.~1~")
     ⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo~")
     ⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo")
     ⇒ "~rms/foo"
Function: file-name-extension filename &optional period

This function returns filename’s final “extension”, if any, after applying file-name-sans-versions to remove any version/backup part. The extension, in a file name, is the part that follows the last ‘.’ in the last name component (minus any version/backup part).

This function returns nil for extensionless file names such as foo. It returns "" for null extensions, as in foo.. If the last component of a file name begins with a ‘.’, that ‘.’ doesn’t count as the beginning of an extension. Thus, .emacs’s “extension” is nil, not ‘.emacs’.

If period is non-nil, then the returned value includes the period that delimits the extension, and if filename has no extension, the value is "".

Function: file-name-sans-extension filename

This function returns filename minus its extension, if any. The version/backup part, if present, is only removed if the file has an extension. For example,

(file-name-sans-extension "foo.lose.c")
     ⇒ "foo.lose"
(file-name-sans-extension "big.hack/foo")
     ⇒ "big.hack/foo"
(file-name-sans-extension "/my/home/.emacs")
     ⇒ "/my/home/.emacs"
(file-name-sans-extension "/my/home/.emacs.el")
     ⇒ "/my/home/.emacs"
(file-name-sans-extension "~/foo.el.~3~")
     ⇒ "~/foo"
(file-name-sans-extension "~/foo.~3~")
     ⇒ "~/foo.~3~"

Note that the ‘.~3~’ in the two last examples is the backup part, not an extension.

Function: file-name-base &optional filename

This function is the composition of file-name-sans-extension and file-name-nondirectory. For example,

(file-name-base "/my/home/foo.c")
    ⇒ "foo"

The filename argument defaults to buffer-file-name.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.2 Absolute and Relative File Names

All the directories in the file system form a tree starting at the root directory. A file name can specify all the directory names starting from the root of the tree; then it is called an absolute file name. Or it can specify the position of the file in the tree relative to a default directory; then it is called a relative file name. On Unix and GNU/Linux, an absolute file name starts with a ‘/’ or a ‘~’ (see abbreviate-file-name), and a relative one does not. On MS-DOS and MS-Windows, an absolute file name starts with a slash or a backslash, or with a drive specification ‘x:/’, where x is the drive letter.

Function: file-name-absolute-p filename

This function returns t if file filename is an absolute file name, nil otherwise.

(file-name-absolute-p "~rms/foo")
     ⇒ t
(file-name-absolute-p "rms/foo")
     ⇒ nil
(file-name-absolute-p "/user/rms/foo")
     ⇒ t

Given a possibly relative file name, you can convert it to an absolute name using expand-file-name (see section Functions that Expand Filenames). This function converts absolute file names to relative names:

Function: file-relative-name filename &optional directory

This function tries to return a relative name that is equivalent to filename, assuming the result will be interpreted relative to directory (an absolute directory name or directory file name). If directory is omitted or nil, it defaults to the current buffer’s default directory.

On some operating systems, an absolute file name begins with a device name. On such systems, filename has no relative equivalent based on directory if they start with two different device names. In this case, file-relative-name returns filename in absolute form.

(file-relative-name "/foo/bar" "/foo/")
     ⇒ "bar"
(file-relative-name "/foo/bar" "/hack/")
     ⇒ "../foo/bar"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.3 Directory Names

A directory name is the name of a directory. A directory is actually a kind of file, so it has a file name, which is related to the directory name but not identical to it. (This is not quite the same as the usual Unix terminology.) These two different names for the same entity are related by a syntactic transformation. On GNU and Unix systems, this is simple: a directory name ends in a slash, whereas the directory’s name as a file lacks that slash. On MS-DOS the relationship is more complicated.

The difference between a directory name and its name as a file is subtle but crucial. When an Emacs variable or function argument is described as being a directory name, a file name of a directory is not acceptable. When file-name-directory returns a string, that is always a directory name.

The following two functions convert between directory names and file names. They do nothing special with environment variable substitutions such as ‘$HOME’, and the constructs ‘~’, ‘.’ and ‘..’.

Function: file-name-as-directory filename

This function returns a string representing filename in a form that the operating system will interpret as the name of a directory. On most systems, this means appending a slash to the string (if it does not already end in one).

(file-name-as-directory "~rms/lewis")
     ⇒ "~rms/lewis/"
Function: directory-file-name dirname

This function returns a string representing dirname in a form that the operating system will interpret as the name of a file. On most systems, this means removing the final slash (or backslash) from the string.

(directory-file-name "~lewis/")
     ⇒ "~lewis"

Given a directory name, you can combine it with a relative file name using concat:

(concat dirname relfile)

Be sure to verify that the file name is relative before doing that. If you use an absolute file name, the results could be syntactically invalid or refer to the wrong file.

If you want to use a directory file name in making such a combination, you must first convert it to a directory name using file-name-as-directory:

(concat (file-name-as-directory dirfile) relfile)

Don’t try concatenating a slash by hand, as in

;;; Wrong!
(concat dirfile "/" relfile)

because this is not portable. Always use file-name-as-directory.

To convert a directory name to its abbreviation, use this function:

Function: abbreviate-file-name filename

This function returns an abbreviated form of filename. It applies the abbreviations specified in directory-abbrev-alist (see File Aliases in The GNU Emacs Manual), then substitutes ‘~’ for the user’s home directory if the argument names a file in the home directory or one of its subdirectories. If the home directory is a root directory, it is not replaced with ‘~’, because this does not make the result shorter on many systems.

You can use this function for directory names and for file names, because it recognizes abbreviations even as part of the name.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.4 Functions that Expand Filenames

Expanding a file name means converting a relative file name to an absolute one. Since this is done relative to a default directory, you must specify the default directory name as well as the file name to be expanded. It also involves expanding abbreviations like ~/ (see abbreviate-file-name), and eliminating redundancies like ./ and name/../.

Function: expand-file-name filename &optional directory

This function converts filename to an absolute file name. If directory is supplied, it is the default directory to start with if filename is relative. (The value of directory should itself be an absolute directory name or directory file name; it may start with ‘~’.) Otherwise, the current buffer’s value of default-directory is used. For example:

(expand-file-name "foo")
     ⇒ "/xcssun/users/rms/lewis/foo"
(expand-file-name "../foo")
     ⇒ "/xcssun/users/rms/foo"
(expand-file-name "foo" "/usr/spool/")
     ⇒ "/usr/spool/foo"

If the part of the combined file name before the first slash is ‘~’, it expands to the value of the HOME environment variable (usually your home directory). If the part before the first slash is ‘~user’ and if user is a valid login name, it expands to user’s home directory.

Filenames containing ‘.’ or ‘..’ are simplified to their canonical form:

(expand-file-name "bar/../foo")
     ⇒ "/xcssun/users/rms/lewis/foo"

In some cases, a leading ‘..’ component can remain in the output:

(expand-file-name "../home" "/")
     ⇒ "/../home"

This is for the sake of filesystems that have the concept of a “superroot” above the root directory /. On other filesystems, /../ is interpreted exactly the same as /.

Note that expand-file-name does not expand environment variables; only substitute-in-file-name does that:

(expand-file-name "$HOME/foo")
     ⇒ "/xcssun/users/rms/lewis/$HOME/foo"

Note also that expand-file-name does not follow symbolic links at any level. This results in a difference between the way file-truename and expand-file-name treat ‘..’. Assuming that ‘/tmp/bar’ is a symbolic link to the directory ‘/tmp/foo/bar’ we get:

(file-truename "/tmp/bar/../myfile")
     ⇒ "/tmp/foo/myfile"
(expand-file-name "/tmp/bar/../myfile")
     ⇒ "/tmp/myfile"

If you may need to follow symbolic links preceding ‘..’, you should make sure to call file-truename without prior direct or indirect calls to expand-file-name. See section Truenames.

Variable: default-directory

The value of this buffer-local variable is the default directory for the current buffer. It should be an absolute directory name; it may start with ‘~’. This variable is buffer-local in every buffer.

expand-file-name uses the default directory when its second argument is nil.

The value is always a string ending with a slash.

default-directory
     ⇒ "/user/lewis/manual/"
Function: substitute-in-file-name filename

This function replaces environment variable references in filename with the environment variable values. Following standard Unix shell syntax, ‘$’ is the prefix to substitute an environment variable value. If the input contains ‘$$’, that is converted to ‘$’; this gives the user a way to “quote” a ‘$’.

The environment variable name is the series of alphanumeric characters (including underscores) that follow the ‘$’. If the character following the ‘$’ is a ‘{’, then the variable name is everything up to the matching ‘}’.

Calling substitute-in-file-name on output produced by substitute-in-file-name tends to give incorrect results. For instance, use of ‘$$’ to quote a single ‘$’ won’t work properly, and ‘$’ in an environment variable’s value could lead to repeated substitution. Therefore, programs that call this function and put the output where it will be passed to this function need to double all ‘$’ characters to prevent subsequent incorrect results.

Here we assume that the environment variable HOME, which holds the user’s home directory name, has value ‘/xcssun/users/rms’.

(substitute-in-file-name "$HOME/foo")
     ⇒ "/xcssun/users/rms/foo"

After substitution, if a ‘~’ or a ‘/’ appears immediately after another ‘/’, the function discards everything before it (up through the immediately preceding ‘/’).

(substitute-in-file-name "bar/~/foo")
     ⇒ "~/foo"
(substitute-in-file-name "/usr/local/$HOME/foo")
     ⇒ "/xcssun/users/rms/foo"
     ;; /usr/local/ has been discarded.

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.5 Generating Unique File Names

Some programs need to write temporary files. Here is the usual way to construct a name for such a file:

(make-temp-file name-of-application)

The job of make-temp-file is to prevent two different users or two different jobs from trying to use the exact same file name.

Function: make-temp-file prefix &optional dir-flag suffix

This function creates a temporary file and returns its name. Emacs creates the temporary file’s name by adding to prefix some random characters that are different in each Emacs job. The result is guaranteed to be a newly created empty file. On MS-DOS, this function can truncate the string prefix to fit into the 8+3 file-name limits. If prefix is a relative file name, it is expanded against temporary-file-directory.

(make-temp-file "foo")
     ⇒ "/tmp/foo232J6v"

When make-temp-file returns, the file has been created and is empty. At that point, you should write the intended contents into the file.

If dir-flag is non-nil, make-temp-file creates an empty directory instead of an empty file. It returns the file name, not the directory name, of that directory. See section Directory Names.

If suffix is non-nil, make-temp-file adds it at the end of the file name.

To prevent conflicts among different libraries running in the same Emacs, each Lisp program that uses make-temp-file should have its own prefix. The number added to the end of prefix distinguishes between the same application running in different Emacs jobs. Additional added characters permit a large number of distinct names even in one Emacs job.

The default directory for temporary files is controlled by the variable temporary-file-directory. This variable gives the user a uniform way to specify the directory for all temporary files. Some programs use small-temporary-file-directory instead, if that is non-nil. To use it, you should expand the prefix against the proper directory before calling make-temp-file.

User Option: temporary-file-directory

This variable specifies the directory name for creating temporary files. Its value should be a directory name (see section Directory Names), but it is good for Lisp programs to cope if the value is a directory’s file name instead. Using the value as the second argument to expand-file-name is a good way to achieve that.

The default value is determined in a reasonable way for your operating system; it is based on the TMPDIR, TMP and TEMP environment variables, with a fall-back to a system-dependent name if none of these variables is defined.

Even if you do not use make-temp-file to create the temporary file, you should still use this variable to decide which directory to put the file in. However, if you expect the file to be small, you should use small-temporary-file-directory first if that is non-nil.

User Option: small-temporary-file-directory

This variable specifies the directory name for creating certain temporary files, which are likely to be small.

If you want to write a temporary file which is likely to be small, you should compute the directory like this:

(make-temp-file
  (expand-file-name prefix
                    (or small-temporary-file-directory
                        temporary-file-directory)))
Function: make-temp-name base-name

This function generates a string that can be used as a unique file name. The name starts with base-name, and has several random characters appended to it, which are different in each Emacs job. It is like make-temp-file except that (i) it just constructs a name, and does not create a file, and (ii) base-name should be an absolute file name (on MS-DOS, this function can truncate base-name to fit into the 8+3 file-name limits).

Warning: In most cases, you should not use this function; use make-temp-file instead! This function is susceptible to a race condition, between the make-temp-name call and the creation of the file, which in some cases may cause a security hole.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.6 File Name Completion

This section describes low-level subroutines for completing a file name. For higher level functions, see Reading File Names.

Function: file-name-all-completions partial-filename directory

This function returns a list of all possible completions for a file whose name starts with partial-filename in directory directory. The order of the completions is the order of the files in the directory, which is unpredictable and conveys no useful information.

The argument partial-filename must be a file name containing no directory part and no slash (or backslash on some systems). The current buffer’s default directory is prepended to directory, if directory is not absolute.

In the following example, suppose that ~rms/lewis is the current default directory, and has five files whose names begin with ‘f’: foo, file~, file.c, file.c.~1~, and file.c.~2~.

(file-name-all-completions "f" "")
     ⇒ ("foo" "file~" "file.c.~2~"
                "file.c.~1~" "file.c")
(file-name-all-completions "fo" "")
     ⇒ ("foo")
Function: file-name-completion filename directory &optional predicate

This function completes the file name filename in directory directory. It returns the longest prefix common to all file names in directory directory that start with filename. If predicate is non-nil then it ignores possible completions that don’t satisfy predicate, after calling that function with one argument, the expanded absolute file name.

If only one match exists and filename matches it exactly, the function returns t. The function returns nil if directory directory contains no name starting with filename.

In the following example, suppose that the current default directory has five files whose names begin with ‘f’: foo, file~, file.c, file.c.~1~, and file.c.~2~.

(file-name-completion "fi" "")
     ⇒ "file"
(file-name-completion "file.c.~1" "")
     ⇒ "file.c.~1~"
(file-name-completion "file.c.~1~" "")
     ⇒ t
(file-name-completion "file.c.~3" "")
     ⇒ nil
User Option: completion-ignored-extensions

file-name-completion usually ignores file names that end in any string in this list. It does not ignore them when all the possible completions end in one of these suffixes. This variable has no effect on file-name-all-completions.

A typical value might look like this:

completion-ignored-extensions
     ⇒ (".o" ".elc" "~" ".dvi")

If an element of completion-ignored-extensions ends in a slash ‘/’, it signals a directory. The elements which do not end in a slash will never match a directory; thus, the above value will not filter out a directory named foo.elc.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.7 Standard File Names

Sometimes, an Emacs Lisp program needs to specify a standard file name for a particular use—typically, to hold configuration data specified by the current user. Usually, such files should be located in the directory specified by user-emacs-directory, which is ~/.emacs.d by default (see section The Init File). For example, abbrev definitions are stored by default in ~/.emacs.d/abbrev_defs. The easiest way to specify such a file name is to use the function locate-user-emacs-file.

Function: locate-user-emacs-file base-name &optional old-name

This function returns an absolute file name for an Emacs-specific configuration or data file. The argument base-name should be a relative file name. The return value is the absolute name of a file in the directory specified by user-emacs-directory; if that directory does not exist, this function creates it.

If the optional argument old-name is non-nil, it specifies a file in the user’s home directory, ~/old-name. If such a file exists, the return value is the absolute name of that file, instead of the file specified by base-name. This argument is intended to be used by Emacs packages to provide backward compatibility. For instance, prior to the introduction of user-emacs-directory, the abbrev file was located in ~/.abbrev_defs. Here is the definition of abbrev-file-name:

(defcustom abbrev-file-name
  (locate-user-emacs-file "abbrev_defs" ".abbrev_defs")
  "Default name of file from which to read abbrevs."
  …
  :type 'file)

A lower-level function for standardizing file names, which locate-user-emacs-file uses as a subroutine, is convert-standard-filename.

Function: convert-standard-filename filename

This function returns a file name based on filename, which fits the conventions of the current operating system.

On GNU and Unix systems, this simply returns filename. On other operating systems, it may enforce system-specific file name conventions; for example, on MS-DOS this function performs a variety of changes to enforce MS-DOS file name limitations, including converting any leading ‘.’ to ‘_’ and truncating to three characters after the ‘.’.

The recommended way to use this function is to specify a name which fits the conventions of GNU and Unix systems, and pass it to convert-standard-filename.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.9 Contents of Directories

A directory is a kind of file that contains other files entered under various names. Directories are a feature of the file system.

Emacs can list the names of the files in a directory as a Lisp list, or display the names in a buffer using the ls shell command. In the latter case, it can optionally display information about each file, depending on the options passed to the ls command.

Function: directory-files directory &optional full-name match-regexp nosort

This function returns a list of the names of the files in the directory directory. By default, the list is in alphabetical order.

If full-name is non-nil, the function returns the files’ absolute file names. Otherwise, it returns the names relative to the specified directory.

If match-regexp is non-nil, this function returns only those file names that contain a match for that regular expression—the other file names are excluded from the list. On case-insensitive filesystems, the regular expression matching is case-insensitive.

If nosort is non-nil, directory-files does not sort the list, so you get the file names in no particular order. Use this if you want the utmost possible speed and don’t care what order the files are processed in. If the order of processing is visible to the user, then the user will probably be happier if you do sort the names.

(directory-files "~lewis")
     ⇒ ("#foo#" "#foo.el#" "." ".."
         "dired-mods.el" "files.texi"
         "files.texi.~1~")

An error is signaled if directory is not the name of a directory that can be read.

Function: directory-files-and-attributes directory &optional full-name match-regexp nosort id-format

This is similar to directory-files in deciding which files to report on and how to report their names. However, instead of returning a list of file names, it returns for each file a list (filename . attributes), where attributes is what file-attributes would return for that file. The optional argument id-format has the same meaning as the corresponding argument to file-attributes (see Definition of file-attributes).

Function: file-expand-wildcards pattern &optional full

This function expands the wildcard pattern pattern, returning a list of file names that match it.

If pattern is written as an absolute file name, the values are absolute also.

If pattern is written as a relative file name, it is interpreted relative to the current default directory. The file names returned are normally also relative to the current default directory. However, if full is non-nil, they are absolute.

Function: insert-directory file switches &optional wildcard full-directory-p

This function inserts (in the current buffer) a directory listing for directory file, formatted with ls according to switches. It leaves point after the inserted text. switches may be a string of options, or a list of strings representing individual options.

The argument file may be either a directory name or a file specification including wildcard characters. If wildcard is non-nil, that means treat file as a file specification with wildcards.

If full-directory-p is non-nil, that means the directory listing is expected to show the full contents of a directory. You should specify t when file is a directory and switches do not contain ‘-d’. (The ‘-d’ option to ls says to describe a directory itself as a file, rather than showing its contents.)

On most systems, this function works by running a directory listing program whose name is in the variable insert-directory-program. If wildcard is non-nil, it also runs the shell specified by shell-file-name, to expand the wildcards.

MS-DOS and MS-Windows systems usually lack the standard Unix program ls, so this function emulates the standard Unix program ls with Lisp code.

As a technical detail, when switches contains the long ‘--dired’ option, insert-directory treats it specially, for the sake of dired. However, the normally equivalent short ‘-D’ option is just passed on to insert-directory-program, as any other option.

Variable: insert-directory-program

This variable’s value is the program to run to generate a directory listing for the function insert-directory. It is ignored on systems which generate the listing with Lisp code.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.10 Creating, Copying and Deleting Directories

Most Emacs Lisp file-manipulation functions get errors when used on files that are directories. For example, you cannot delete a directory with delete-file. These special functions exist to create and delete directories.

Command: make-directory dirname &optional parents

This command creates a directory named dirname. If parents is non-nil, as is always the case in an interactive call, that means to create the parent directories first, if they don’t already exist.

mkdir is an alias for this.

Command: copy-directory dirname newname &optional keep-time parents copy-contents

This command copies the directory named dirname to newname. If newname names an existing directory, dirname will be copied to a subdirectory there.

It always sets the file modes of the copied files to match the corresponding original file.

The third argument keep-time non-nil means to preserve the modification time of the copied files. A prefix arg makes keep-time non-nil.

The fourth argument parents says whether to create parent directories if they don’t exist. Interactively, this happens by default.

The fifth argument copy-contents, if non-nil, means to copy the contents of dirname directly into newname if the latter is an existing directory, instead of copying dirname into it as a subdirectory.

Command: delete-directory dirname &optional recursive trash

This command deletes the directory named dirname. The function delete-file does not work for files that are directories; you must use delete-directory for them. If recursive is nil, and the directory contains any files, delete-directory signals an error.

delete-directory only follows symbolic links at the level of parent directories.

If the optional argument trash is non-nil and the variable delete-by-moving-to-trash is non-nil, this command moves the file into the system Trash instead of deleting it. See Miscellaneous File Operations in The GNU Emacs Manual. When called interactively, trash is t if no prefix argument is given, and nil otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.11 Making Certain File Names “Magic”

You can implement special handling for certain file names. This is called making those names magic. The principal use for this feature is in implementing access to remote files (see Remote Files in The GNU Emacs Manual).

To define a kind of magic file name, you must supply a regular expression to define the class of names (all those that match the regular expression), plus a handler that implements all the primitive Emacs file operations for file names that match.

The variable file-name-handler-alist holds a list of handlers, together with regular expressions that determine when to apply each handler. Each element has this form:

(regexp . handler)

All the Emacs primitives for file access and file name transformation check the given file name against file-name-handler-alist. If the file name matches regexp, the primitives handle that file by calling handler.

The first argument given to handler is the name of the primitive, as a symbol; the remaining arguments are the arguments that were passed to that primitive. (The first of these arguments is most often the file name itself.) For example, if you do this:

(file-exists-p filename)

and filename has handler handler, then handler is called like this:

(funcall handler 'file-exists-p filename)

When a function takes two or more arguments that must be file names, it checks each of those names for a handler. For example, if you do this:

(expand-file-name filename dirname)

then it checks for a handler for filename and then for a handler for dirname. In either case, the handler is called like this:

(funcall handler 'expand-file-name filename dirname)

The handler then needs to figure out whether to handle filename or dirname.

If the specified file name matches more than one handler, the one whose match starts last in the file name gets precedence. This rule is chosen so that handlers for jobs such as uncompression are handled first, before handlers for jobs such as remote file access.

Here are the operations that a magic file name handler gets to handle:

access-file, add-name-to-file, byte-compiler-base-file-name,
copy-directory, copy-file, delete-directory, delete-file, diff-latest-backup-file, directory-file-name, directory-files, directory-files-and-attributes, dired-compress-file, dired-uncache,
expand-file-name, file-accessible-directory-p, file-acl, file-attributes, file-directory-p, file-equal-p, file-executable-p, file-exists-p, file-in-directory-p, file-local-copy, file-modes, file-name-all-completions, file-name-as-directory, file-name-completion, file-name-directory, file-name-nondirectory, file-name-sans-versions, file-newer-than-file-p, file-notify-add-watch, file-notify-rm-watch, file-ownership-preserved-p, file-readable-p, file-regular-p, file-remote-p, file-selinux-context, file-symlink-p, file-truename, file-writable-p, find-backup-file-name, get-file-buffer, insert-directory, insert-file-contents,
load, make-auto-save-file-name, make-directory, make-directory-internal, make-symbolic-link,
process-file, rename-file, set-file-acl, set-file-modes, set-file-selinux-context, set-file-times, set-visited-file-modtime, shell-command, start-file-process, substitute-in-file-name,
unhandled-file-name-directory, vc-registered, verify-visited-file-modtime,
write-region.

Handlers for insert-file-contents typically need to clear the buffer’s modified flag, with (set-buffer-modified-p nil), if the visit argument is non-nil. This also has the effect of unlocking the buffer if it is locked.

The handler function must handle all of the above operations, and possibly others to be added in the future. It need not implement all these operations itself—when it has nothing special to do for a certain operation, it can reinvoke the primitive, to handle the operation “in the usual way”. It should always reinvoke the primitive for an operation it does not recognize. Here’s one way to do this:

(defun my-file-handler (operation &rest args)
  ;; First check for the specific operations
  ;; that we have special handling for.
  (cond ((eq operation 'insert-file-contents) …)
        ((eq operation 'write-region) …)
        …
        ;; Handle any operation we don’t know about.
        (t (let ((inhibit-file-name-handlers
                  (cons 'my-file-handler
                        (and (eq inhibit-file-name-operation operation)
                             inhibit-file-name-handlers)))
                 (inhibit-file-name-operation operation))
             (apply operation args)))))

When a handler function decides to call the ordinary Emacs primitive for the operation at hand, it needs to prevent the primitive from calling the same handler once again, thus leading to an infinite recursion. The example above shows how to do this, with the variables inhibit-file-name-handlers and inhibit-file-name-operation. Be careful to use them exactly as shown above; the details are crucial for proper behavior in the case of multiple handlers, and for operations that have two file names that may each have handlers.

Handlers that don’t really do anything special for actual access to the file—such as the ones that implement completion of host names for remote file names—should have a non-nil safe-magic property. For instance, Emacs normally “protects” directory names it finds in PATH from becoming magic, if they look like magic file names, by prefixing them with ‘/:’. But if the handler that would be used for them has a non-nil safe-magic property, the ‘/:’ is not added.

A file name handler can have an operations property to declare which operations it handles in a nontrivial way. If this property has a non-nil value, it should be a list of operations; then only those operations will call the handler. This avoids inefficiency, but its main purpose is for autoloaded handler functions, so that they won’t be loaded except when they have real work to do.

Simply deferring all operations to the usual primitives does not work. For instance, if the file name handler applies to file-exists-p, then it must handle load itself, because the usual load code won’t work properly in that case. However, if the handler uses the operations property to say it doesn’t handle file-exists-p, then it need not handle load nontrivially.

Variable: inhibit-file-name-handlers

This variable holds a list of handlers whose use is presently inhibited for a certain operation.

Variable: inhibit-file-name-operation

The operation for which certain handlers are presently inhibited.

Function: find-file-name-handler file operation

This function returns the handler function for file name file, or nil if there is none. The argument operation should be the operation to be performed on the file—the value you will pass to the handler as its first argument when you call it. If operation equals inhibit-file-name-operation, or if it is not found in the operations property of the handler, this function returns nil.

Function: file-local-copy filename

This function copies file filename to an ordinary non-magic file on the local machine, if it isn’t on the local machine already. Magic file names should handle the file-local-copy operation if they refer to files on other machines. A magic file name that is used for other purposes than remote file access should not handle file-local-copy; then this function will treat the file as local.

If filename is local, whether magic or not, this function does nothing and returns nil. Otherwise it returns the file name of the local copy file.

Function: file-remote-p filename &optional identification connected

This function tests whether filename is a remote file. If filename is local (not remote), the return value is nil. If filename is indeed remote, the return value is a string that identifies the remote system.

This identifier string can include a host name and a user name, as well as characters designating the method used to access the remote system. For example, the remote identifier string for the filename /sudo::/some/file is /sudo:root@localhost:.

If file-remote-p returns the same identifier for two different filenames, that means they are stored on the same file system and can be accessed locally with respect to each other. This means, for example, that it is possible to start a remote process accessing both files at the same time. Implementers of file handlers need to ensure this principle is valid.

identification specifies which part of the identifier shall be returned as string. identification can be the symbol method, user or host; any other value is handled like nil and means to return the complete identifier string. In the example above, the remote user identifier string would be root.

If connected is non-nil, this function returns nil even if filename is remote, if Emacs has no network connection to its host. This is useful when you want to avoid the delay of making connections when they don’t exist.

Function: unhandled-file-name-directory filename

This function returns the name of a directory that is not magic. It uses the directory part of filename if that is not magic. For a magic file name, it invokes the file name handler, which therefore decides what value to return. If filename is not accessible from a local process, then the file name handler should indicate it by returning nil.

This is useful for running a subprocess; every subprocess must have a non-magic directory to serve as its current directory, and this function is a good way to come up with one.

User Option: remote-file-name-inhibit-cache

The attributes of remote files can be cached for better performance. If they are changed outside of Emacs’s control, the cached values become invalid, and must be reread.

When this variable is set to nil, cached values are never expired. Use this setting with caution, only if you are sure nothing other than Emacs ever changes the remote files. If it is set to t, cached values are never used. This is the safest value, but could result in performance degradation.

A compromise is to set it to a positive number. This means that cached values are used for that amount of seconds since they were cached. If a remote file is checked regularly, it might be a good idea to let-bind this variable to a value less than the time period between consecutive checks. For example:

(defun display-time-file-nonempty-p (file)
  (let ((remote-file-name-inhibit-cache
         (- display-time-interval 5)))
    (and (file-exists-p file)
         (< 0 (nth 7 (file-attributes
                       (file-chase-links file)))))))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.12 File Format Conversion

Emacs performs several steps to convert the data in a buffer (text, text properties, and possibly other information) to and from a representation suitable for storing into a file. This section describes the fundamental functions that perform this format conversion, namely insert-file-contents for reading a file into a buffer, and write-region for writing a buffer into a file.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.12.1 Overview

The function insert-file-contents:

The function write-region:

This shows the symmetry of the lowest-level operations; reading and writing handle things in opposite order. The rest of this section describes the two facilities surrounding the three variables named above, as well as some related functions. Coding Systems, for details on character encoding and decoding.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.12.2 Round-Trip Specification

The most general of the two facilities is controlled by the variable format-alist, a list of file format specifications, which describe textual representations used in files for the data in an Emacs buffer. The descriptions for reading and writing are paired, which is why we call this “round-trip” specification (see section Piecemeal Specification, for non-paired specification).

Variable: format-alist

This list contains one format definition for each defined file format. Each format definition is a list of this form:

(name doc-string regexp from-fn to-fn modify mode-fn preserve)

Here is what the elements in a format definition mean:

name

The name of this format.

doc-string

A documentation string for the format.

regexp

A regular expression which is used to recognize files represented in this format. If nil, the format is never applied automatically.

from-fn

A shell command or function to decode data in this format (to convert file data into the usual Emacs data representation).

A shell command is represented as a string; Emacs runs the command as a filter to perform the conversion.

If from-fn is a function, it is called with two arguments, begin and end, which specify the part of the buffer it should convert. It should convert the text by editing it in place. Since this can change the length of the text, from-fn should return the modified end position.

One responsibility of from-fn is to make sure that the beginning of the file no longer matches regexp. Otherwise it is likely to get called again.

to-fn

A shell command or function to encode data in this format—that is, to convert the usual Emacs data representation into this format.

If to-fn is a string, it is a shell command; Emacs runs the command as a filter to perform the conversion.

If to-fn is a function, it is called with three arguments: begin and end, which specify the part of the buffer it should convert, and buffer, which specifies which buffer. There are two ways it can do the conversion:

modify

A flag, t if the encoding function modifies the buffer, and nil if it works by returning a list of annotations.

mode-fn

A minor-mode function to call after visiting a file converted from this format. The function is called with one argument, the integer 1; that tells a minor-mode function to enable the mode.

preserve

A flag, t if format-write-file should not remove this format from buffer-file-format.

The function insert-file-contents automatically recognizes file formats when it reads the specified file. It checks the text of the beginning of the file against the regular expressions of the format definitions, and if it finds a match, it calls the decoding function for that format. Then it checks all the known formats over again. It keeps checking them until none of them is applicable.

Visiting a file, with find-file-noselect or the commands that use it, performs conversion likewise (because it calls insert-file-contents); it also calls the mode function for each format that it decodes. It stores a list of the format names in the buffer-local variable buffer-file-format.

Variable: buffer-file-format

This variable states the format of the visited file. More precisely, this is a list of the file format names that were decoded in the course of visiting the current buffer’s file. It is always buffer-local in all buffers.

When write-region writes data into a file, it first calls the encoding functions for the formats listed in buffer-file-format, in the order of appearance in the list.

Command: format-write-file file format &optional confirm

This command writes the current buffer contents into the file file in a format based on format, which is a list of format names. It constructs the actual format starting from format, then appending any elements from the value of buffer-file-format with a non-nil preserve flag (see above), if they are not already present in format. It then updates buffer-file-format with this format, making it the default for future saves. Except for the format argument, this command is similar to write-file. In particular, confirm has the same meaning and interactive treatment as the corresponding argument to write-file. See Definition of write-file.

Command: format-find-file file format

This command finds the file file, converting it according to format format. It also makes format the default if the buffer is saved later.

The argument format is a list of format names. If format is nil, no conversion takes place. Interactively, typing just RET for format specifies nil.

Command: format-insert-file file format &optional beg end

This command inserts the contents of file file, converting it according to format format. If beg and end are non-nil, they specify which part of the file to read, as in insert-file-contents (see section Reading from Files).

The return value is like what insert-file-contents returns: a list of the absolute file name and the length of the data inserted (after conversion).

The argument format is a list of format names. If format is nil, no conversion takes place. Interactively, typing just RET for format specifies nil.

Variable: buffer-auto-save-file-format

This variable specifies the format to use for auto-saving. Its value is a list of format names, just like the value of buffer-file-format; however, it is used instead of buffer-file-format for writing auto-save files. If the value is t, the default, auto-saving uses the same format as a regular save in the same buffer. This variable is always buffer-local in all buffers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.12.3 Piecemeal Specification

In contrast to the round-trip specification described in the previous subsection (see section Round-Trip Specification), you can use the variables after-insert-file-functions and write-region-annotate-functions to separately control the respective reading and writing conversions.

Conversion starts with one representation and produces another representation. When there is only one conversion to do, there is no conflict about what to start with. However, when there are multiple conversions involved, conflict may arise when two conversions need to start with the same data.

This situation is best understood in the context of converting text properties during write-region. For example, the character at position 42 in a buffer is ‘X’ with a text property foo. If the conversion for foo is done by inserting into the buffer, say, ‘FOO:’, then that changes the character at position 42 from ‘X’ to ‘F’. The next conversion will start with the wrong data straight away.

To avoid conflict, cooperative conversions do not modify the buffer, but instead specify annotations, a list of elements of the form (position . string), sorted in order of increasing position.

If there is more than one conversion, write-region merges their annotations destructively into one sorted list. Later, when the text from the buffer is actually written to the file, it intermixes the specified annotations at the corresponding positions. All this takes place without modifying the buffer.

In contrast, when reading, the annotations intermixed with the text are handled immediately. insert-file-contents sets point to the beginning of some text to be converted, then calls the conversion functions with the length of that text. These functions should always return with point at the beginning of the inserted text. This approach makes sense for reading because annotations removed by the first converter can’t be mistakenly processed by a later converter. Each conversion function should scan for the annotations it recognizes, remove the annotation, modify the buffer text (to set a text property, for example), and return the updated length of the text, as it stands after those changes. The value returned by one function becomes the argument to the next function.

Variable: write-region-annotate-functions

A list of functions for write-region to call. Each function in the list is called with two arguments: the start and end of the region to be written. These functions should not alter the contents of the buffer. Instead, they should return annotations.

As a special case, a function may return with a different buffer current. Emacs takes this to mean that the current buffer contains altered text to be output. It therefore changes the start and end arguments of the write-region call, giving them the values of point-min and point-max in the new buffer, respectively. It also discards all previous annotations, because they should have been dealt with by this function.

Variable: write-region-post-annotation-function

The value of this variable, if non-nil, should be a function. This function is called, with no arguments, after write-region has completed.

If any function in write-region-annotate-functions returns with a different buffer current, Emacs calls write-region-post-annotation-function more than once. Emacs calls it with the last buffer that was current, and again with the buffer before that, and so on back to the original buffer.

Thus, a function in write-region-annotate-functions can create a buffer, give this variable the local value of kill-buffer in that buffer, set up the buffer with altered text, and make the buffer current. The buffer will be killed after write-region is done.

Variable: after-insert-file-functions

Each function in this list is called by insert-file-contents with one argument, the number of characters inserted, and with point at the beginning of the inserted text. Each function should leave point unchanged, and return the new character count describing the inserted text as modified by the function.

We invite users to write Lisp programs to store and retrieve text properties in files, using these hooks, and thus to experiment with various data formats and find good ones. Eventually we hope users will produce good, general extensions we can install in Emacs.

We suggest not trying to handle arbitrary Lisp objects as text property names or values—because a program that general is probably difficult to write, and slow. Instead, choose a set of possible data types that are reasonably flexible, and not too hard to encode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25 Backups and Auto-Saving

Backup files and auto-save files are two methods by which Emacs tries to protect the user from the consequences of crashes or of the user’s own errors. Auto-saving preserves the text from earlier in the current editing session; backup files preserve file contents prior to the current session.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1 Backup Files

A backup file is a copy of the old contents of a file you are editing. Emacs makes a backup file the first time you save a buffer into its visited file. Thus, normally, the backup file contains the contents of the file as it was before the current editing session. The contents of the backup file normally remain unchanged once it exists.

Backups are usually made by renaming the visited file to a new name. Optionally, you can specify that backup files should be made by copying the visited file. This choice makes a difference for files with multiple names; it also can affect whether the edited file remains owned by the original owner or becomes owned by the user editing it.

By default, Emacs makes a single backup file for each file edited. You can alternatively request numbered backups; then each new backup file gets a new name. You can delete old numbered backups when you don’t want them any more, or Emacs can delete them automatically.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1.1 Making Backup Files

Function: backup-buffer

This function makes a backup of the file visited by the current buffer, if appropriate. It is called by save-buffer before saving the buffer the first time.

If a backup was made by renaming, the return value is a cons cell of the form (modes extra-alist backupname), where modes are the mode bits of the original file, as returned by file-modes (see section Testing Accessibility), extra-alist is an alist describing the original file’s extended attributes, as returned by file-extended-attributes (see section Extended File Attributes), and backupname is the name of the backup.

In all other cases (i.e., if a backup was made by copying or if no backup was made), this function returns nil.

Variable: buffer-backed-up

This buffer-local variable says whether this buffer’s file has been backed up on account of this buffer. If it is non-nil, the backup file has been written. Otherwise, the file should be backed up when it is next saved (if backups are enabled). This is a permanent local; kill-all-local-variables does not alter it.

User Option: make-backup-files

This variable determines whether or not to make backup files. If it is non-nil, then Emacs creates a backup of each file when it is saved for the first time—provided that backup-inhibited is nil (see below).

The following example shows how to change the make-backup-files variable only in the Rmail buffers and not elsewhere. Setting it nil stops Emacs from making backups of these files, which may save disk space. (You would put this code in your init file.)

(add-hook 'rmail-mode-hook
          (lambda () (setq-local make-backup-files nil)))
Variable: backup-enable-predicate

This variable’s value is a function to be called on certain occasions to decide whether a file should have backup files. The function receives one argument, an absolute file name to consider. If the function returns nil, backups are disabled for that file. Otherwise, the other variables in this section say whether and how to make backups.

The default value is normal-backup-enable-predicate, which checks for files in temporary-file-directory and small-temporary-file-directory.

Variable: backup-inhibited

If this variable is non-nil, backups are inhibited. It records the result of testing backup-enable-predicate on the visited file name. It can also coherently be used by other mechanisms that inhibit backups based on which file is visited. For example, VC sets this variable non-nil to prevent making backups for files managed with a version control system.

This is a permanent local, so that changing the major mode does not lose its value. Major modes should not set this variable—they should set make-backup-files instead.

User Option: backup-directory-alist

This variable’s value is an alist of filename patterns and backup directory names. Each element looks like

(regexp . directory)

Backups of files with names matching regexp will be made in directory. directory may be relative or absolute. If it is absolute, so that all matching files are backed up into the same directory, the file names in this directory will be the full name of the file backed up with all directory separators changed to ‘!’ to prevent clashes. This will not work correctly if your filesystem truncates the resulting name.

For the common case of all backups going into one directory, the alist should contain a single element pairing ‘"."’ with the appropriate directory name.

If this variable is nil (the default), or it fails to match a filename, the backup is made in the original file’s directory.

On MS-DOS filesystems without long names this variable is always ignored.

User Option: make-backup-file-name-function

This variable’s value is a function to use for making backup file names. The function make-backup-file-name calls it. See section Naming Backup Files.

This could be buffer-local to do something special for specific files. If you change it, you may need to change backup-file-name-p and file-name-sans-versions too.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1.2 Backup by Renaming or by Copying?

There are two ways that Emacs can make a backup file:

The first method, renaming, is the default.

The variable backup-by-copying, if non-nil, says to use the second method, which is to copy the original file and overwrite it with the new buffer contents. The variable file-precious-flag, if non-nil, also has this effect (as a sideline of its main significance). See section Saving Buffers.

User Option: backup-by-copying

If this variable is non-nil, Emacs always makes backup files by copying. The default is nil.

The following three variables, when non-nil, cause the second method to be used in certain special cases. They have no effect on the treatment of files that don’t fall into the special cases.

User Option: backup-by-copying-when-linked

If this variable is non-nil, Emacs makes backups by copying for files with multiple names (hard links). The default is nil.

This variable is significant only if backup-by-copying is nil, since copying is always used when that variable is non-nil.

User Option: backup-by-copying-when-mismatch

If this variable is non-nil (the default), Emacs makes backups by copying in cases where renaming would change either the owner or the group of the file.

The value has no effect when renaming would not alter the owner or group of the file; that is, for files which are owned by the user and whose group matches the default for a new file created there by the user.

This variable is significant only if backup-by-copying is nil, since copying is always used when that variable is non-nil.

User Option: backup-by-copying-when-privileged-mismatch

This variable, if non-nil, specifies the same behavior as backup-by-copying-when-mismatch, but only for certain user-id values: namely, those less than or equal to a certain number. You set this variable to that number.

Thus, if you set backup-by-copying-when-privileged-mismatch to 0, backup by copying is done for the superuser only, when necessary to prevent a change in the owner of the file.

The default is 200.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1.3 Making and Deleting Numbered Backup Files

If a file’s name is foo, the names of its numbered backup versions are foo.~v~, for various integers v, like this: foo.~1~, foo.~2~, foo.~3~, …, foo.~259~, and so on.

User Option: version-control

This variable controls whether to make a single non-numbered backup file or multiple numbered backups.

nil

Make numbered backups if the visited file already has numbered backups; otherwise, do not. This is the default.

never

Do not make numbered backups.

anything else

Make numbered backups.

The use of numbered backups ultimately leads to a large number of backup versions, which must then be deleted. Emacs can do this automatically or it can ask the user whether to delete them.

User Option: kept-new-versions

The value of this variable is the number of newest versions to keep when a new numbered backup is made. The newly made backup is included in the count. The default value is 2.

User Option: kept-old-versions

The value of this variable is the number of oldest versions to keep when a new numbered backup is made. The default value is 2.

If there are backups numbered 1, 2, 3, 5, and 7, and both of these variables have the value 2, then the backups numbered 1 and 2 are kept as old versions and those numbered 5 and 7 are kept as new versions; backup version 3 is excess. The function find-backup-file-name (see section Naming Backup Files) is responsible for determining which backup versions to delete, but does not delete them itself.

User Option: delete-old-versions

If this variable is t, then saving a file deletes excess backup versions silently. If it is nil, that means to ask for confirmation before deleting excess backups. Otherwise, they are not deleted at all.

User Option: dired-kept-versions

This variable specifies how many of the newest backup versions to keep in the Dired command . (dired-clean-directory). That’s the same thing kept-new-versions specifies when you make a new backup file. The default is 2.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1.4 Naming Backup Files

The functions in this section are documented mainly because you can customize the naming conventions for backup files by redefining them. If you change one, you probably need to change the rest.

Function: backup-file-name-p filename

This function returns a non-nil value if filename is a possible name for a backup file. It just checks the name, not whether a file with the name filename exists.

(backup-file-name-p "foo")
     ⇒ nil
(backup-file-name-p "foo~")
     ⇒ 3

The standard definition of this function is as follows:

(defun backup-file-name-p (file)
  "Return non-nil if FILE is a backup file \
name (numeric or not)..."
  (string-match "~\\'" file))

Thus, the function returns a non-nil value if the file name ends with a ‘~’. (We use a backslash to split the documentation string’s first line into two lines in the text, but produce just one line in the string itself.)

This simple expression is placed in a separate function to make it easy to redefine for customization.

Function: make-backup-file-name filename

This function returns a string that is the name to use for a non-numbered backup file for file filename. On Unix, this is just filename with a tilde appended.

The standard definition of this function, on most operating systems, is as follows:

(defun make-backup-file-name (file)
  "Create the non-numeric backup file name for FILE..."
  (concat file "~"))

You can change the backup-file naming convention by redefining this function. The following example redefines make-backup-file-name to prepend a ‘.’ in addition to appending a tilde:

(defun make-backup-file-name (filename)
  (expand-file-name
    (concat "." (file-name-nondirectory filename) "~")
    (file-name-directory filename)))
(make-backup-file-name "backups.texi")
     ⇒ ".backups.texi~"

Some parts of Emacs, including some Dired commands, assume that backup file names end with ‘~’. If you do not follow that convention, it will not cause serious problems, but these commands may give less-than-desirable results.

Function: find-backup-file-name filename

This function computes the file name for a new backup file for filename. It may also propose certain existing backup files for deletion. find-backup-file-name returns a list whose CAR is the name for the new backup file and whose CDR is a list of backup files whose deletion is proposed. The value can also be nil, which means not to make a backup.

Two variables, kept-old-versions and kept-new-versions, determine which backup versions should be kept. This function keeps those versions by excluding them from the CDR of the value. See section Making and Deleting Numbered Backup Files.

In this example, the value says that ~rms/foo.~5~ is the name to use for the new backup file, and ~rms/foo.~3~ is an “excess” version that the caller should consider deleting now.

(find-backup-file-name "~rms/foo")
     ⇒ ("~rms/foo.~5~" "~rms/foo.~3~")
Function: file-newest-backup filename

This function returns the name of the most recent backup file for filename, or nil if that file has no backup files.

Some file comparison commands use this function so that they can automatically compare a file with its most recent backup.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.2 Auto-Saving

Emacs periodically saves all files that you are visiting; this is called auto-saving. Auto-saving prevents you from losing more than a limited amount of work if the system crashes. By default, auto-saves happen every 300 keystrokes, or after around 30 seconds of idle time. See Auto-Saving: Protection Against Disasters in The GNU Emacs Manual, for information on auto-save for users. Here we describe the functions used to implement auto-saving and the variables that control them.

Variable: buffer-auto-save-file-name

This buffer-local variable is the name of the file used for auto-saving the current buffer. It is nil if the buffer should not be auto-saved.

buffer-auto-save-file-name
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
Command: auto-save-mode arg

This is the mode command for Auto Save mode, a buffer-local minor mode. When Auto Save mode is enabled, auto-saving is enabled in the buffer. The calling convention is the same as for other minor mode commands (see section Conventions for Writing Minor Modes).

Unlike most minor modes, there is no auto-save-mode variable. Auto Save mode is enabled if buffer-auto-save-file-name is non-nil and buffer-saved-size (see below) is non-zero.

Function: auto-save-file-name-p filename

This function returns a non-nil value if filename is a string that could be the name of an auto-save file. It assumes the usual naming convention for auto-save files: a name that begins and ends with hash marks (‘#’) is a possible auto-save file name. The argument filename should not contain a directory part.

(make-auto-save-file-name)
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
(auto-save-file-name-p "#backups.texi#")
     ⇒ 0
(auto-save-file-name-p "backups.texi")
     ⇒ nil

The standard definition of this function is as follows:

(defun auto-save-file-name-p (filename)
  "Return non-nil if FILENAME can be yielded by..."
  (string-match "^#.*#$" filename))

This function exists so that you can customize it if you wish to change the naming convention for auto-save files. If you redefine it, be sure to redefine the function make-auto-save-file-name correspondingly.

Function: make-auto-save-file-name

This function returns the file name to use for auto-saving the current buffer. This is just the file name with hash marks (‘#’) prepended and appended to it. This function does not look at the variable auto-save-visited-file-name (described below); callers of this function should check that variable first.

(make-auto-save-file-name)
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"

Here is a simplified version of the standard definition of this function:

(defun make-auto-save-file-name ()
  "Return file name to use for auto-saves \
of current buffer.."
  (if buffer-file-name
      (concat
       (file-name-directory buffer-file-name)
       "#"
       (file-name-nondirectory buffer-file-name)
       "#")
    (expand-file-name
     (concat "#%" (buffer-name) "#"))))

This exists as a separate function so that you can redefine it to customize the naming convention for auto-save files. Be sure to change auto-save-file-name-p in a corresponding way.

User Option: auto-save-visited-file-name

If this variable is non-nil, Emacs auto-saves buffers in the files they are visiting. That is, the auto-save is done in the same file that you are editing. Normally, this variable is nil, so auto-save files have distinct names that are created by make-auto-save-file-name.

When you change the value of this variable, the new value does not take effect in an existing buffer until the next time auto-save mode is reenabled in it. If auto-save mode is already enabled, auto-saves continue to go in the same file name until auto-save-mode is called again.

Function: recent-auto-save-p

This function returns t if the current buffer has been auto-saved since the last time it was read in or saved.

Function: set-buffer-auto-saved

This function marks the current buffer as auto-saved. The buffer will not be auto-saved again until the buffer text is changed again. The function returns nil.

User Option: auto-save-interval

The value of this variable specifies how often to do auto-saving, in terms of number of input events. Each time this many additional input events are read, Emacs does auto-saving for all buffers in which that is enabled. Setting this to zero disables autosaving based on the number of characters typed.

User Option: auto-save-timeout

The value of this variable is the number of seconds of idle time that should cause auto-saving. Each time the user pauses for this long, Emacs does auto-saving for all buffers in which that is enabled. (If the current buffer is large, the specified timeout is multiplied by a factor that increases as the size increases; for a million-byte buffer, the factor is almost 4.)

If the value is zero or nil, then auto-saving is not done as a result of idleness, only after a certain number of input events as specified by auto-save-interval.

Variable: auto-save-hook

This normal hook is run whenever an auto-save is about to happen.

User Option: auto-save-default

If this variable is non-nil, buffers that are visiting files have auto-saving enabled by default. Otherwise, they do not.

Command: do-auto-save &optional no-message current-only

This function auto-saves all buffers that need to be auto-saved. It saves all buffers for which auto-saving is enabled and that have been changed since the previous auto-save.

If any buffers are auto-saved, do-auto-save normally displays a message saying ‘Auto-saving...’ in the echo area while auto-saving is going on. However, if no-message is non-nil, the message is inhibited.

If current-only is non-nil, only the current buffer is auto-saved.

Function: delete-auto-save-file-if-necessary &optional force

This function deletes the current buffer’s auto-save file if delete-auto-save-files is non-nil. It is called every time a buffer is saved.

Unless force is non-nil, this function only deletes the file if it was written by the current Emacs session since the last true save.

User Option: delete-auto-save-files

This variable is used by the function delete-auto-save-file-if-necessary. If it is non-nil, Emacs deletes auto-save files when a true save is done (in the visited file). This saves disk space and unclutters your directory.

Function: rename-auto-save-file

This function adjusts the current buffer’s auto-save file name if the visited file name has changed. It also renames an existing auto-save file, if it was made in the current Emacs session. If the visited file name has not changed, this function does nothing.

Variable: buffer-saved-size

The value of this buffer-local variable is the length of the current buffer, when it was last read in, saved, or auto-saved. This is used to detect a substantial decrease in size, and turn off auto-saving in response.

If it is -1, that means auto-saving is temporarily shut off in this buffer due to a substantial decrease in size. Explicitly saving the buffer stores a positive value in this variable, thus reenabling auto-saving. Turning auto-save mode off or on also updates this variable, so that the substantial decrease in size is forgotten.

If it is -2, that means this buffer should disregard changes in buffer size; in particular, it should not shut off auto-saving temporarily due to changes in buffer size.

Variable: auto-save-list-file-name

This variable (if non-nil) specifies a file for recording the names of all the auto-save files. Each time Emacs does auto-saving, it writes two lines into this file for each buffer that has auto-saving enabled. The first line gives the name of the visited file (it’s empty if the buffer has none), and the second gives the name of the auto-save file.

When Emacs exits normally, it deletes this file; if Emacs crashes, you can look in the file to find all the auto-save files that might contain work that was otherwise lost. The recover-session command uses this file to find them.

The default name for this file specifies your home directory and starts with ‘.saves-’. It also contains the Emacs process ID and the host name.

User Option: auto-save-list-file-prefix

After Emacs reads your init file, it initializes auto-save-list-file-name (if you have not already set it non-nil) based on this prefix, adding the host name and process ID. If you set this to nil in your init file, then Emacs does not initialize auto-save-list-file-name.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.3 Reverting

If you have made extensive changes to a file and then change your mind about them, you can get rid of them by reading in the previous version of the file with the revert-buffer command. See Reverting a Buffer in The GNU Emacs Manual.

Command: revert-buffer &optional ignore-auto noconfirm preserve-modes

This command replaces the buffer text with the text of the visited file on disk. This action undoes all changes since the file was visited or saved.

By default, if the latest auto-save file is more recent than the visited file, and the argument ignore-auto is nil, revert-buffer asks the user whether to use that auto-save instead. When you invoke this command interactively, ignore-auto is t if there is no numeric prefix argument; thus, the interactive default is not to check the auto-save file.

Normally, revert-buffer asks for confirmation before it changes the buffer; but if the argument noconfirm is non-nil, revert-buffer does not ask for confirmation.

Normally, this command reinitializes the buffer’s major and minor modes using normal-mode. But if preserve-modes is non-nil, the modes remain unchanged.

Reverting tries to preserve marker positions in the buffer by using the replacement feature of insert-file-contents. If the buffer contents and the file contents are identical before the revert operation, reverting preserves all the markers. If they are not identical, reverting does change the buffer; in that case, it preserves the markers in the unchanged text (if any) at the beginning and end of the buffer. Preserving any additional markers would be problematical.

Variable: revert-buffer-in-progress-p

revert-buffer binds this variable to a non-nil value while it is working.

You can customize how revert-buffer does its work by setting the variables described in the rest of this section.

User Option: revert-without-query

This variable holds a list of files that should be reverted without query. The value is a list of regular expressions. If the visited file name matches one of these regular expressions, and the file has changed on disk but the buffer is not modified, then revert-buffer reverts the file without asking the user for confirmation.

Some major modes customize revert-buffer by making buffer-local bindings for these variables:

Variable: revert-buffer-function

The value of this variable is the function to use to revert this buffer. It should be a function with two optional arguments to do the work of reverting. The two optional arguments, ignore-auto and noconfirm, are the arguments that revert-buffer received.

Modes such as Dired mode, in which the text being edited does not consist of a file’s contents but can be regenerated in some other fashion, can give this variable a buffer-local value that is a special function to regenerate the contents.

Variable: revert-buffer-insert-file-contents-function

The value of this variable specifies the function to use to insert the updated contents when reverting this buffer. The function receives two arguments: first the file name to use; second, t if the user has asked to read the auto-save file.

The reason for a mode to change this variable instead of revert-buffer-function is to avoid duplicating or replacing the rest of what revert-buffer does: asking for confirmation, clearing the undo list, deciding the proper major mode, and running the hooks listed below.

Variable: before-revert-hook

This normal hook is run by the default revert-buffer-function before inserting the modified contents. A custom revert-buffer-function may or may not run this hook.

Variable: after-revert-hook

This normal hook is run by the default revert-buffer-function after inserting the modified contents. A custom revert-buffer-function may or may not run this hook.

Variable: buffer-stale-function

The value of this variable specifies a function to call to check whether a buffer needs reverting. The default value only handles buffers that are visiting files, by checking their modification time. Buffers that are not visiting files require a custom function (see (emacs)Supporting additional buffers).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26 Buffers

A buffer is a Lisp object containing text to be edited. Buffers are used to hold the contents of files that are being visited; there may also be buffers that are not visiting files. While several buffers may exist at one time, only one buffer is designated the current buffer at any time. Most editing commands act on the contents of the current buffer. Each buffer, including the current buffer, may or may not be displayed in any windows.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.1 Buffer Basics

A buffer is a Lisp object containing text to be edited. Buffers are used to hold the contents of files that are being visited; there may also be buffers that are not visiting files. Although several buffers normally exist, only one buffer is designated the current buffer at any time. Most editing commands act on the contents of the current buffer. Each buffer, including the current buffer, may or may not be displayed in any windows.

Buffers in Emacs editing are objects that have distinct names and hold text that can be edited. Buffers appear to Lisp programs as a special data type. You can think of the contents of a buffer as a string that you can extend; insertions and deletions may occur in any part of the buffer. See section Text.

A Lisp buffer object contains numerous pieces of information. Some of this information is directly accessible to the programmer through variables, while other information is accessible only through special-purpose functions. For example, the visited file name is directly accessible through a variable, while the value of point is accessible only through a primitive function.

Buffer-specific information that is directly accessible is stored in buffer-local variable bindings, which are variable values that are effective only in a particular buffer. This feature allows each buffer to override the values of certain variables. Most major modes override variables such as fill-column or comment-column in this way. For more information about buffer-local variables and functions related to them, see Buffer-Local Variables.

For functions and variables related to visiting files in buffers, see Visiting Files and Saving Buffers. For functions and variables related to the display of buffers in windows, see Buffers and Windows.

Function: bufferp object

This function returns t if object is a buffer, nil otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.2 The Current Buffer

There are, in general, many buffers in an Emacs session. At any time, one of them is designated the current buffer—the buffer in which most editing takes place. Most of the primitives for examining or changing text operate implicitly on the current buffer (see section Text).

Normally, the buffer displayed in the selected window is the current buffer, but this is not always so: a Lisp program can temporarily designate any buffer as current in order to operate on its contents, without changing what is displayed on the screen. The most basic function for designating a current buffer is set-buffer.

Function: current-buffer

This function returns the current buffer.

(current-buffer)
     ⇒ #<buffer buffers.texi>
Function: set-buffer buffer-or-name

This function makes buffer-or-name the current buffer. buffer-or-name must be an existing buffer or the name of an existing buffer. The return value is the buffer made current.

This function does not display the buffer in any window, so the user cannot necessarily see the buffer. But Lisp programs will now operate on it.

When an editing command returns to the editor command loop, Emacs automatically calls set-buffer on the buffer shown in the selected window. This is to prevent confusion: it ensures that the buffer that the cursor is in, when Emacs reads a command, is the buffer to which that command applies (see section Command Loop). Thus, you should not use set-buffer to switch visibly to a different buffer; for that, use the functions described in Switching to a Buffer in a Window.

When writing a Lisp function, do not rely on this behavior of the command loop to restore the current buffer after an operation. Editing commands can also be called as Lisp functions by other programs, not just from the command loop; it is convenient for the caller if the subroutine does not change which buffer is current (unless, of course, that is the subroutine’s purpose).

To operate temporarily on another buffer, put the set-buffer within a save-current-buffer form. Here, as an example, is a simplified version of the command append-to-buffer:

(defun append-to-buffer (buffer start end)
  "Append the text of the region to BUFFER."
  (interactive "BAppend to buffer: \nr")
  (let ((oldbuf (current-buffer)))
    (save-current-buffer
      (set-buffer (get-buffer-create buffer))
      (insert-buffer-substring oldbuf start end))))

Here, we bind a local variable to record the current buffer, and then save-current-buffer arranges to make it current again later. Next, set-buffer makes the specified buffer current, and insert-buffer-substring copies the string from the original buffer to the specified (and now current) buffer.

Alternatively, we can use the with-current-buffer macro:

(defun append-to-buffer (buffer start end)
  "Append the text of the region to BUFFER."
  (interactive "BAppend to buffer: \nr")
  (let ((oldbuf (current-buffer)))
    (with-current-buffer (get-buffer-create buffer)
      (insert-buffer-substring oldbuf start end))))

In either case, if the buffer appended to happens to be displayed in some window, the next redisplay will show how its text has changed. If it is not displayed in any window, you will not see the change immediately on the screen. The command causes the buffer to become current temporarily, but does not cause it to be displayed.

If you make local bindings (with let or function arguments) for a variable that may also have buffer-local bindings, make sure that the same buffer is current at the beginning and at the end of the local binding’s scope. Otherwise you might bind it in one buffer and unbind it in another!

Do not rely on using set-buffer to change the current buffer back, because that won’t do the job if a quit happens while the wrong buffer is current. For instance, in the previous example, it would have been wrong to do this:

  (let ((oldbuf (current-buffer)))
    (set-buffer (get-buffer-create buffer))
    (insert-buffer-substring oldbuf start end)
    (set-buffer oldbuf))

Using save-current-buffer or with-current-buffer, as we did, correctly handles quitting, errors, and throw, as well as ordinary evaluation.

Special Form: save-current-buffer body…

The save-current-buffer special form saves the identity of the current buffer, evaluates the body forms, and finally restores that buffer as current. The return value is the value of the last form in body. The current buffer is restored even in case of an abnormal exit via throw or error (see section Nonlocal Exits).

If the buffer that used to be current has been killed by the time of exit from save-current-buffer, then it is not made current again, of course. Instead, whichever buffer was current just before exit remains current.

Macro: with-current-buffer buffer-or-name body…

The with-current-buffer macro saves the identity of the current buffer, makes buffer-or-name current, evaluates the body forms, and finally restores the current buffer. buffer-or-name must specify an existing buffer or the name of an existing buffer.

The return value is the value of the last form in body. The current buffer is restored even in case of an abnormal exit via throw or error (see section Nonlocal Exits).

Macro: with-temp-buffer body…

The with-temp-buffer macro evaluates the body forms with a temporary buffer as the current buffer. It saves the identity of the current buffer, creates a temporary buffer and makes it current, evaluates the body forms, and finally restores the previous current buffer while killing the temporary buffer. By default, undo information (see section Undo) is not recorded in the buffer created by this macro (but body can enable that, if needed).

The return value is the value of the last form in body. You can return the contents of the temporary buffer by using (buffer-string) as the last form.

The current buffer is restored even in case of an abnormal exit via throw or error (see section Nonlocal Exits).

See also with-temp-file in Writing to Files.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.3 Buffer Names

Each buffer has a unique name, which is a string. Many of the functions that work on buffers accept either a buffer or a buffer name as an argument. Any argument called buffer-or-name is of this sort, and an error is signaled if it is neither a string nor a buffer. Any argument called buffer must be an actual buffer object, not a name.

Buffers that are ephemeral and generally uninteresting to the user have names starting with a space, so that the list-buffers and buffer-menu commands don’t mention them (but if such a buffer visits a file, it is mentioned). A name starting with space also initially disables recording undo information; see Undo.

Function: buffer-name &optional buffer

This function returns the name of buffer as a string. buffer defaults to the current buffer.

If buffer-name returns nil, it means that buffer has been killed. See section Killing Buffers.

(buffer-name)
     ⇒ "buffers.texi"
(setq foo (get-buffer "temp"))
     ⇒ #<buffer temp>
(kill-buffer foo)
     ⇒ nil
(buffer-name foo)
     ⇒ nil
foo
     ⇒ #<killed buffer>
Command: rename-buffer newname &optional unique

This function renames the current buffer to newname. An error is signaled if newname is not a string.

Ordinarily, rename-buffer signals an error if newname is already in use. However, if unique is non-nil, it modifies newname to make a name that is not in use. Interactively, you can make unique non-nil with a numeric prefix argument. (This is how the command rename-uniquely is implemented.)

This function returns the name actually given to the buffer.

Function: get-buffer buffer-or-name

This function returns the buffer specified by buffer-or-name. If buffer-or-name is a string and there is no buffer with that name, the value is nil. If buffer-or-name is a buffer, it is returned as given; that is not very useful, so the argument is usually a name. For example:

(setq b (get-buffer "lewis"))
     ⇒ #<buffer lewis>
(get-buffer b)
     ⇒ #<buffer lewis>
(get-buffer "Frazzle-nots")
     ⇒ nil

See also the function get-buffer-create in Creating Buffers.

Function: generate-new-buffer-name starting-name &optional ignore

This function returns a name that would be unique for a new buffer—but does not create the buffer. It starts with starting-name, and produces a name not currently in use for any buffer by appending a number inside of ‘<…>’. It starts at 2 and keeps incrementing the number until it is not the name of an existing buffer.

If the optional second argument ignore is non-nil, it should be a string, a potential buffer name. It means to consider that potential buffer acceptable, if it is tried, even it is the name of an existing buffer (which would normally be rejected). Thus, if buffers named ‘foo’, ‘foo<2>’, ‘foo<3>’ and ‘foo<4>’ exist,

(generate-new-buffer-name "foo")
     ⇒ "foo<5>"
(generate-new-buffer-name "foo" "foo<3>")
     ⇒ "foo<3>"
(generate-new-buffer-name "foo" "foo<6>")
     ⇒ "foo<5>"

See the related function generate-new-buffer in Creating Buffers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.4 Buffer File Name

The buffer file name is the name of the file that is visited in that buffer. When a buffer is not visiting a file, its buffer file name is nil. Most of the time, the buffer name is the same as the nondirectory part of the buffer file name, but the buffer file name and the buffer name are distinct and can be set independently. See section Visiting Files.

Function: buffer-file-name &optional buffer

This function returns the absolute file name of the file that buffer is visiting. If buffer is not visiting any file, buffer-file-name returns nil. If buffer is not supplied, it defaults to the current buffer.

(buffer-file-name (other-buffer))
     ⇒ "/usr/user/lewis/manual/files.texi"
Variable: buffer-file-name

This buffer-local variable contains the name of the file being visited in the current buffer, or nil if it is not visiting a file. It is a permanent local variable, unaffected by kill-all-local-variables.

buffer-file-name
     ⇒ "/usr/user/lewis/manual/buffers.texi"

It is risky to change this variable’s value without doing various other things. Normally it is better to use set-visited-file-name (see below); some of the things done there, such as changing the buffer name, are not strictly necessary, but others are essential to avoid confusing Emacs.

Variable: buffer-file-truename

This buffer-local variable holds the abbreviated truename of the file visited in the current buffer, or nil if no file is visited. It is a permanent local, unaffected by kill-all-local-variables. See section Truenames, and abbreviate-file-name.

Variable: buffer-file-number

This buffer-local variable holds the file number and directory device number of the file visited in the current buffer, or nil if no file or a nonexistent file is visited. It is a permanent local, unaffected by kill-all-local-variables.

The value is normally a list of the form (filenum devnum). This pair of numbers uniquely identifies the file among all files accessible on the system. See the function file-attributes, in File Attributes, for more information about them.

If buffer-file-name is the name of a symbolic link, then both numbers refer to the recursive target.

Function: get-file-buffer filename

This function returns the buffer visiting file filename. If there is no such buffer, it returns nil. The argument filename, which must be a string, is expanded (see section Functions that Expand Filenames), then compared against the visited file names of all live buffers. Note that the buffer’s buffer-file-name must match the expansion of filename exactly. This function will not recognize other names for the same file.

(get-file-buffer "buffers.texi")
    ⇒ #<buffer buffers.texi>

In unusual circumstances, there can be more than one buffer visiting the same file name. In such cases, this function returns the first such buffer in the buffer list.

Function: find-buffer-visiting filename &optional predicate

This is like get-file-buffer, except that it can return any buffer visiting the file possibly under a different name. That is, the buffer’s buffer-file-name does not need to match the expansion of filename exactly, it only needs to refer to the same file. If predicate is non-nil, it should be a function of one argument, a buffer visiting filename. The buffer is only considered a suitable return value if predicate returns non-nil. If it can not find a suitable buffer to return, find-buffer-visiting returns nil.

Command: set-visited-file-name filename &optional no-query along-with-file

If filename is a non-empty string, this function changes the name of the file visited in the current buffer to filename. (If the buffer had no visited file, this gives it one.) The next time the buffer is saved it will go in the newly-specified file.

This command marks the buffer as modified, since it does not (as far as Emacs knows) match the contents of filename, even if it matched the former visited file. It also renames the buffer to correspond to the new file name, unless the new name is already in use.

If filename is nil or the empty string, that stands for “no visited file”. In this case, set-visited-file-name marks the buffer as having no visited file, without changing the buffer’s modified flag.

Normally, this function asks the user for confirmation if there already is a buffer visiting filename. If no-query is non-nil, that prevents asking this question. If there already is a buffer visiting filename, and the user confirms or no-query is non-nil, this function makes the new buffer name unique by appending a number inside of ‘<…>’ to filename.

If along-with-file is non-nil, that means to assume that the former visited file has been renamed to filename. In this case, the command does not change the buffer’s modified flag, nor the buffer’s recorded last file modification time as reported by visited-file-modtime (see section Buffer Modification Time). If along-with-file is nil, this function clears the recorded last file modification time, after which visited-file-modtime returns zero.

When the function set-visited-file-name is called interactively, it prompts for filename in the minibuffer.

Variable: list-buffers-directory

This buffer-local variable specifies a string to display in a buffer listing where the visited file name would go, for buffers that don’t have a visited file name. Dired buffers use this variable.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.5 Buffer Modification

Emacs keeps a flag called the modified flag for each buffer, to record whether you have changed the text of the buffer. This flag is set to t whenever you alter the contents of the buffer, and cleared to nil when you save it. Thus, the flag shows whether there are unsaved changes. The flag value is normally shown in the mode line (see section Variables Used in the Mode Line), and controls saving (see section Saving Buffers) and auto-saving (see section Auto-Saving).

Some Lisp programs set the flag explicitly. For example, the function set-visited-file-name sets the flag to t, because the text does not match the newly-visited file, even if it is unchanged from the file formerly visited.

The functions that modify the contents of buffers are described in Text.

Function: buffer-modified-p &optional buffer

This function returns t if the buffer buffer has been modified since it was last read in from a file or saved, or nil otherwise. If buffer is not supplied, the current buffer is tested.

Function: set-buffer-modified-p flag

This function marks the current buffer as modified if flag is non-nil, or as unmodified if the flag is nil.

Another effect of calling this function is to cause unconditional redisplay of the mode line for the current buffer. In fact, the function force-mode-line-update works by doing this:

(set-buffer-modified-p (buffer-modified-p))
Function: restore-buffer-modified-p flag

Like set-buffer-modified-p, but does not force redisplay of mode lines.

Command: not-modified &optional arg

This command marks the current buffer as unmodified, and not needing to be saved. If arg is non-nil, it marks the buffer as modified, so that it will be saved at the next suitable occasion. Interactively, arg is the prefix argument.

Don’t use this function in programs, since it prints a message in the echo area; use set-buffer-modified-p (above) instead.

Function: buffer-modified-tick &optional buffer

This function returns buffer’s modification-count. This is a counter that increments every time the buffer is modified. If buffer is nil (or omitted), the current buffer is used. The counter can wrap around occasionally.

Function: buffer-chars-modified-tick &optional buffer

This function returns buffer’s character-change modification-count. Changes to text properties leave this counter unchanged; however, each time text is inserted or removed from the buffer, the counter is reset to the value that would be returned by buffer-modified-tick. By comparing the values returned by two buffer-chars-modified-tick calls, you can tell whether a character change occurred in that buffer in between the calls. If buffer is nil (or omitted), the current buffer is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.6 Buffer Modification Time

Suppose that you visit a file and make changes in its buffer, and meanwhile the file itself is changed on disk. At this point, saving the buffer would overwrite the changes in the file. Occasionally this may be what you want, but usually it would lose valuable information. Emacs therefore checks the file’s modification time using the functions described below before saving the file. (See section File Attributes, for how to examine a file’s modification time.)

Function: verify-visited-file-modtime &optional buffer

This function compares what buffer (by default, the current-buffer) has recorded for the modification time of its visited file against the actual modification time of the file as recorded by the operating system. The two should be the same unless some other process has written the file since Emacs visited or saved it.

The function returns t if the last actual modification time and Emacs’s recorded modification time are the same, nil otherwise. It also returns t if the buffer has no recorded last modification time, that is if visited-file-modtime would return zero.

It always returns t for buffers that are not visiting a file, even if visited-file-modtime returns a non-zero value. For instance, it always returns t for dired buffers. It returns t for buffers that are visiting a file that does not exist and never existed, but nil for file-visiting buffers whose file has been deleted.

Function: clear-visited-file-modtime

This function clears out the record of the last modification time of the file being visited by the current buffer. As a result, the next attempt to save this buffer will not complain of a discrepancy in file modification times.

This function is called in set-visited-file-name and other exceptional places where the usual test to avoid overwriting a changed file should not be done.

Function: visited-file-modtime

This function returns the current buffer’s recorded last file modification time, as a list of the form (high low microsec picosec). (This is the same format that file-attributes uses to return time values; see section File Attributes.)

If the buffer has no recorded last modification time, this function returns zero. This case occurs, for instance, if the buffer is not visiting a file or if the time has been explicitly cleared by clear-visited-file-modtime. Note, however, that visited-file-modtime returns a list for some non-file buffers too. For instance, in a Dired buffer listing a directory, it returns the last modification time of that directory, as recorded by Dired.

If the buffer is not visiting a file, this function returns -1.

Function: set-visited-file-modtime &optional time

This function updates the buffer’s record of the last modification time of the visited file, to the value specified by time if time is not nil, and otherwise to the last modification time of the visited file.

If time is neither nil nor zero, it should have the form (high low microsec picosec), the format used by current-time (see section Time of Day).

This function is useful if the buffer was not read from the file normally, or if the file itself has been changed for some known benign reason.

Function: ask-user-about-supersession-threat filename

This function is used to ask a user how to proceed after an attempt to modify an buffer visiting file filename when the file is newer than the buffer text. Emacs detects this because the modification time of the file on disk is newer than the last save-time of the buffer. This means some other program has probably altered the file.

Depending on the user’s answer, the function may return normally, in which case the modification of the buffer proceeds, or it may signal a file-supersession error with data (filename), in which case the proposed buffer modification is not allowed.

This function is called automatically by Emacs on the proper occasions. It exists so you can customize Emacs by redefining it. See the file userlock.el for the standard definition.

See also the file locking mechanism in File Locks.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.7 Read-Only Buffers

If a buffer is read-only, then you cannot change its contents, although you may change your view of the contents by scrolling and narrowing.

Read-only buffers are used in two kinds of situations:

Variable: buffer-read-only

This buffer-local variable specifies whether the buffer is read-only. The buffer is read-only if this variable is non-nil.

Variable: inhibit-read-only

If this variable is non-nil, then read-only buffers and, depending on the actual value, some or all read-only characters may be modified. Read-only characters in a buffer are those that have a non-nil read-only text property. See section Properties with Special Meanings, for more information about text properties.

If inhibit-read-only is t, all read-only character properties have no effect. If inhibit-read-only is a list, then read-only character properties have no effect if they are members of the list (comparison is done with eq).

Command: read-only-mode &optional arg

This is the mode command for Read Only minor mode, a buffer-local minor mode. When the mode is enabled, buffer-read-only is non-nil in the buffer; when disabled, buffer-read-only is nil in the buffer. The calling convention is the same as for other minor mode commands (see section Conventions for Writing Minor Modes).

This minor mode mainly serves as a wrapper for buffer-read-only; unlike most minor modes, there is no separate read-only-mode variable. Even when Read Only mode is disabled, characters with non-nil read-only text properties remain read-only. To temporarily ignore all read-only states, bind inhibit-read-only, as described above.

When enabling Read Only mode, this mode command also enables View mode if the option view-read-only is non-nil. See Miscellaneous Buffer Operations in The GNU Emacs Manual. When disabling Read Only mode, it disables View mode if View mode was enabled.

Function: barf-if-buffer-read-only

This function signals a buffer-read-only error if the current buffer is read-only. See section Using interactive, for another way to signal an error if the current buffer is read-only.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.8 The Buffer List

The buffer list is a list of all live buffers. The order of the buffers in this list is based primarily on how recently each buffer has been displayed in a window. Several functions, notably other-buffer, use this ordering. A buffer list displayed for the user also follows this order.

Creating a buffer adds it to the end of the buffer list, and killing a buffer removes it from that list. A buffer moves to the front of this list whenever it is chosen for display in a window (see section Switching to a Buffer in a Window) or a window displaying it is selected (see section Selecting Windows). A buffer moves to the end of the list when it is buried (see bury-buffer, below). There are no functions available to the Lisp programmer which directly manipulate the buffer list.

In addition to the fundamental buffer list just described, Emacs maintains a local buffer list for each frame, in which the buffers that have been displayed (or had their windows selected) in that frame come first. (This order is recorded in the frame’s buffer-list frame parameter; see Buffer Parameters.) Buffers never displayed in that frame come afterward, ordered according to the fundamental buffer list.

Function: buffer-list &optional frame

This function returns the buffer list, including all buffers, even those whose names begin with a space. The elements are actual buffers, not their names.

If frame is a frame, this returns frame’s local buffer list. If frame is nil or omitted, the fundamental buffer list is used: the buffers appear in order of most recent display or selection, regardless of which frames they were displayed on.

(buffer-list)
     ⇒ (#<buffer buffers.texi>
         #<buffer  *Minibuf-1*> #<buffer buffer.c>
         #<buffer *Help*> #<buffer TAGS>)
;; Note that the name of the minibuffer
;;   begins with a space!
(mapcar (function buffer-name) (buffer-list))
    ⇒ ("buffers.texi" " *Minibuf-1*"
        "buffer.c" "*Help*" "TAGS")

The list returned by buffer-list is constructed specifically; it is not an internal Emacs data structure, and modifying it has no effect on the order of buffers. If you want to change the order of buffers in the fundamental buffer list, here is an easy way:

(defun reorder-buffer-list (new-list)
  (while new-list
    (bury-buffer (car new-list))
    (setq new-list (cdr new-list))))

With this method, you can specify any order for the list, but there is no danger of losing a buffer or adding something that is not a valid live buffer.

To change the order or value of a specific frame’s buffer list, set that frame’s buffer-list parameter with modify-frame-parameters (see section Access to Frame Parameters).

Function: other-buffer &optional buffer visible-ok frame

This function returns the first buffer in the buffer list other than buffer. Usually, this is the buffer appearing in the most recently selected window (in frame frame or else the selected frame, see section Input Focus), aside from buffer. Buffers whose names start with a space are not considered at all.

If buffer is not supplied (or if it is not a live buffer), then other-buffer returns the first buffer in the selected frame’s local buffer list. (If frame is non-nil, it returns the first buffer in frame’s local buffer list instead.)

If frame has a non-nil buffer-predicate parameter, then other-buffer uses that predicate to decide which buffers to consider. It calls the predicate once for each buffer, and if the value is nil, that buffer is ignored. See section Buffer Parameters.

If visible-ok is nil, other-buffer avoids returning a buffer visible in any window on any visible frame, except as a last resort. If visible-ok is non-nil, then it does not matter whether a buffer is displayed somewhere or not.

If no suitable buffer exists, the buffer *scratch* is returned (and created, if necessary).

Function: last-buffer &optional buffer visible-ok frame

This function returns the last buffer in frame’s buffer list other than buffer. If frame is omitted or nil, it uses the selected frame’s buffer list.

The argument visible-ok is handled as with other-buffer, see above. If no suitable buffer can be found, the buffer *scratch* is returned.

Command: bury-buffer &optional buffer-or-name

This command puts buffer-or-name at the end of the buffer list, without changing the order of any of the other buffers on the list. This buffer therefore becomes the least desirable candidate for other-buffer to return. The argument can be either a buffer itself or the name of one.

This function operates on each frame’s buffer-list parameter as well as the fundamental buffer list; therefore, the buffer that you bury will come last in the value of (buffer-list frame) and in the value of (buffer-list). In addition, it also puts the buffer at the end of the list of buffer of the selected window (see section Window History) provided it is shown in that window.

If buffer-or-name is nil or omitted, this means to bury the current buffer. In addition, if the current buffer is displayed in the selected window, this makes sure that the window is either deleted or another buffer is shown in it. More precisely, if the selected window is dedicated (see section Dedicated Windows) and there are other windows on its frame, the window is deleted. If it is the only window on its frame and that frame is not the only frame on its terminal, the frame is “dismissed” by calling the function specified by frame-auto-hide-function (see section Quitting Windows). Otherwise, it calls switch-to-prev-buffer (see section Window History) to show another buffer in that window. If buffer-or-name is displayed in some other window, it remains displayed there.

To replace a buffer in all the windows that display it, use replace-buffer-in-windows, See section Buffers and Windows.

Command: unbury-buffer

This command switches to the last buffer in the local buffer list of the selected frame. More precisely, it calls the function switch-to-buffer (see section Switching to a Buffer in a Window), to display the buffer returned by last-buffer (see above), in the selected window.

Variable: buffer-list-update-hook

This is a normal hook run whenever the buffer list changes. Functions (implicitly) running this hook are get-buffer-create (see section Creating Buffers), rename-buffer (see section Buffer Names), kill-buffer (see section Killing Buffers), bury-buffer (see above) and select-window (see section Selecting Windows).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.9 Creating Buffers

This section describes the two primitives for creating buffers. get-buffer-create creates a buffer if it finds no existing buffer with the specified name; generate-new-buffer always creates a new buffer and gives it a unique name.

Other functions you can use to create buffers include with-output-to-temp-buffer (see section Temporary Displays) and create-file-buffer (see section Visiting Files). Starting a subprocess can also create a buffer (see section Processes).

Function: get-buffer-create buffer-or-name

This function returns a buffer named buffer-or-name. The buffer returned does not become the current buffer—this function does not change which buffer is current.

buffer-or-name must be either a string or an existing buffer. If it is a string and a live buffer with that name already exists, get-buffer-create returns that buffer. If no such buffer exists, it creates a new buffer. If buffer-or-name is a buffer instead of a string, it is returned as given, even if it is dead.

(get-buffer-create "foo")
     ⇒ #<buffer foo>

The major mode for a newly created buffer is set to Fundamental mode. (The default value of the variable major-mode is handled at a higher level; see How Emacs Chooses a Major Mode.) If the name begins with a space, the buffer initially disables undo information recording (see section Undo).

Function: generate-new-buffer name

This function returns a newly created, empty buffer, but does not make it current. The name of the buffer is generated by passing name to the function generate-new-buffer-name (see section Buffer Names). Thus, if there is no buffer named name, then that is the name of the new buffer; if that name is in use, a suffix of the form ‘<n>’, where n is an integer, is appended to name.

An error is signaled if name is not a string.

(generate-new-buffer "bar")
     ⇒ #<buffer bar>
(generate-new-buffer "bar")
     ⇒ #<buffer bar<2>>
(generate-new-buffer "bar")
     ⇒ #<buffer bar<3>>

The major mode for the new buffer is set to Fundamental mode. The default value of the variable major-mode is handled at a higher level. See section How Emacs Chooses a Major Mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.10 Killing Buffers

Killing a buffer makes its name unknown to Emacs and makes the memory space it occupied available for other use.

The buffer object for the buffer that has been killed remains in existence as long as anything refers to it, but it is specially marked so that you cannot make it current or display it. Killed buffers retain their identity, however; if you kill two distinct buffers, they remain distinct according to eq although both are dead.

If you kill a buffer that is current or displayed in a window, Emacs automatically selects or displays some other buffer instead. This means that killing a buffer can change the current buffer. Therefore, when you kill a buffer, you should also take the precautions associated with changing the current buffer (unless you happen to know that the buffer being killed isn’t current). See section The Current Buffer.

If you kill a buffer that is the base buffer of one or more indirect buffers (see section Indirect Buffers), the indirect buffers are automatically killed as well.

The buffer-name of a buffer is nil if, and only if, the buffer is killed. A buffer that has not been killed is called a live buffer. To test whether a buffer is live or killed, use the function buffer-live-p (see below).

Command: kill-buffer &optional buffer-or-name

This function kills the buffer buffer-or-name, freeing all its memory for other uses or to be returned to the operating system. If buffer-or-name is nil or omitted, it kills the current buffer.

Any processes that have this buffer as the process-buffer are sent the SIGHUP (“hangup”) signal, which normally causes them to terminate. See section Sending Signals to Processes.

If the buffer is visiting a file and contains unsaved changes, kill-buffer asks the user to confirm before the buffer is killed. It does this even if not called interactively. To prevent the request for confirmation, clear the modified flag before calling kill-buffer. See section Buffer Modification.

This function calls replace-buffer-in-windows for cleaning up all windows currently displaying the buffer to be killed.

Killing a buffer that is already dead has no effect.

This function returns t if it actually killed the buffer. It returns nil if the user refuses to confirm or if buffer-or-name was already dead.

(kill-buffer "foo.unchanged")
     ⇒ t
(kill-buffer "foo.changed")

---------- Buffer: Minibuffer ----------
Buffer foo.changed modified; kill anyway? (yes or no) yes
---------- Buffer: Minibuffer ----------

     ⇒ t
Variable: kill-buffer-query-functions

Before confirming unsaved changes, kill-buffer calls the functions in the list kill-buffer-query-functions, in order of appearance, with no arguments. The buffer being killed is the current buffer when they are called. The idea of this feature is that these functions will ask for confirmation from the user. If any of them returns nil, kill-buffer spares the buffer’s life.

Variable: kill-buffer-hook

This is a normal hook run by kill-buffer after asking all the questions it is going to ask, just before actually killing the buffer. The buffer to be killed is current when the hook functions run. See section Hooks. This variable is a permanent local, so its local binding is not cleared by changing major modes.

User Option: buffer-offer-save

This variable, if non-nil in a particular buffer, tells save-buffers-kill-emacs and save-some-buffers (if the second optional argument to that function is t) to offer to save that buffer, just as they offer to save file-visiting buffers. See Definition of save-some-buffers. The variable buffer-offer-save automatically becomes buffer-local when set for any reason. See section Buffer-Local Variables.

Variable: buffer-save-without-query

This variable, if non-nil in a particular buffer, tells save-buffers-kill-emacs and save-some-buffers to save this buffer (if it’s modified) without asking the user. The variable automatically becomes buffer-local when set for any reason.

Function: buffer-live-p object

This function returns t if object is a live buffer (a buffer which has not been killed), nil otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.11 Indirect Buffers

An indirect buffer shares the text of some other buffer, which is called the base buffer of the indirect buffer. In some ways it is the analogue, for buffers, of a symbolic link among files. The base buffer may not itself be an indirect buffer.

The text of the indirect buffer is always identical to the text of its base buffer; changes made by editing either one are visible immediately in the other. This includes the text properties as well as the characters themselves.

In all other respects, the indirect buffer and its base buffer are completely separate. They have different names, independent values of point, independent narrowing, independent markers and overlays (though inserting or deleting text in either buffer relocates the markers and overlays for both), independent major modes, and independent buffer-local variable bindings.

An indirect buffer cannot visit a file, but its base buffer can. If you try to save the indirect buffer, that actually saves the base buffer.

Killing an indirect buffer has no effect on its base buffer. Killing the base buffer effectively kills the indirect buffer in that it cannot ever again be the current buffer.

Command: make-indirect-buffer base-buffer name &optional clone

This creates and returns an indirect buffer named name whose base buffer is base-buffer. The argument base-buffer may be a live buffer or the name (a string) of an existing buffer. If name is the name of an existing buffer, an error is signaled.

If clone is non-nil, then the indirect buffer originally shares the “state” of base-buffer such as major mode, minor modes, buffer local variables and so on. If clone is omitted or nil the indirect buffer’s state is set to the default state for new buffers.

If base-buffer is an indirect buffer, its base buffer is used as the base for the new buffer. If, in addition, clone is non-nil, the initial state is copied from the actual base buffer, not from base-buffer.

Command: clone-indirect-buffer newname display-flag &optional norecord

This function creates and returns a new indirect buffer that shares the current buffer’s base buffer and copies the rest of the current buffer’s attributes. (If the current buffer is not indirect, it is used as the base buffer.)

If display-flag is non-nil, that means to display the new buffer by calling pop-to-buffer. If norecord is non-nil, that means not to put the new buffer to the front of the buffer list.

Function: buffer-base-buffer &optional buffer

This function returns the base buffer of buffer, which defaults to the current buffer. If buffer is not indirect, the value is nil. Otherwise, the value is another buffer, which is never an indirect buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.12 Swapping Text Between Two Buffers

Specialized modes sometimes need to let the user access from the same buffer several vastly different types of text. For example, you may need to display a summary of the buffer text, in addition to letting the user access the text itself.

This could be implemented with multiple buffers (kept in sync when the user edits the text), or with narrowing (see section Narrowing). But these alternatives might sometimes become tedious or prohibitively expensive, especially if each type of text requires expensive buffer-global operations in order to provide correct display and editing commands.

Emacs provides another facility for such modes: you can quickly swap buffer text between two buffers with buffer-swap-text. This function is very fast because it doesn’t move any text, it only changes the internal data structures of the buffer object to point to a different chunk of text. Using it, you can pretend that a group of two or more buffers are actually a single virtual buffer that holds the contents of all the individual buffers together.

Function: buffer-swap-text buffer

This function swaps the text of the current buffer and that of its argument buffer. It signals an error if one of the two buffers is an indirect buffer (see section Indirect Buffers) or is a base buffer of an indirect buffer.

All the buffer properties that are related to the buffer text are swapped as well: the positions of point and mark, all the markers, the overlays, the text properties, the undo list, the value of the enable-multibyte-characters flag (see section enable-multibyte-characters), etc.

If you use buffer-swap-text on a file-visiting buffer, you should set up a hook to save the buffer’s original text rather than what it was swapped with. write-region-annotate-functions works for this purpose. You should probably set buffer-saved-size to -2 in the buffer, so that changes in the text it is swapped with will not interfere with auto-saving.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.13 The Buffer Gap

Emacs buffers are implemented using an invisible gap to make insertion and deletion faster. Insertion works by filling in part of the gap, and deletion adds to the gap. Of course, this means that the gap must first be moved to the locus of the insertion or deletion. Emacs moves the gap only when you try to insert or delete. This is why your first editing command in one part of a large buffer, after previously editing in another far-away part, sometimes involves a noticeable delay.

This mechanism works invisibly, and Lisp code should never be affected by the gap’s current location, but these functions are available for getting information about the gap status.

Function: gap-position

This function returns the current gap position in the current buffer.

Function: gap-size

This function returns the current gap size of the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27 Windows

This chapter describes the functions and variables related to Emacs windows. See section Frames, for how windows are assigned an area of screen available for Emacs to use. See section Emacs Display, for information on how text is displayed in windows.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.1 Basic Concepts of Emacs Windows

A window is an area of the screen that is used to display a buffer (see section Buffers). In Emacs Lisp, windows are represented by a special Lisp object type.

Windows are grouped into frames (see section Frames). Each frame contains at least one window; the user can subdivide it into multiple, non-overlapping windows to view several buffers at once. Lisp programs can use multiple windows for a variety of purposes. In Rmail, for example, you can view a summary of message titles in one window, and the contents of the selected message in another window.

Emacs uses the word “window” with a different meaning than in graphical desktop environments and window systems, such as the X Window System. When Emacs is run on X, each of its graphical X windows is an Emacs frame (containing one or more Emacs windows). When Emacs is run on a text terminal, the frame fills the entire terminal screen.

Unlike X windows, Emacs windows are tiled; they never overlap within the area of the frame. When a window is created, resized, or deleted, the change in window space is taken from or given to the adjacent windows, so that the total area of the frame is unchanged.

Function: windowp object

This function returns t if object is a window (whether or not it displays a buffer). Otherwise, it returns nil.

A live window is one that is actually displaying a buffer in a frame.

Function: window-live-p object

This function returns t if object is a live window and nil otherwise. A live window is one that displays a buffer.

The windows in each frame are organized into a window tree. See section Windows and Frames. The leaf nodes of each window tree are live windows—the ones actually displaying buffers. The internal nodes of the window tree are internal windows, which are not live.

A valid window is one that is either live or internal. A valid window can be deleted, i.e., removed from its frame (see section Deleting Windows); then it is no longer valid, but the Lisp object representing it might be still referenced from other Lisp objects. A deleted window may be made valid again by restoring a saved window configuration (see section Window Configurations).

You can distinguish valid windows from deleted windows with window-valid-p.

Function: window-valid-p object

This function returns t if object is a live window, or an internal window in a window tree. Otherwise, it returns nil, including for the case where object is a deleted window.

In each frame, at any time, exactly one Emacs window is designated as selected within the frame. For the selected frame, that window is called the selected window—the one in which most editing takes place, and in which the cursor for selected windows appears (see section Cursor Parameters). The selected window’s buffer is usually also the current buffer, except when set-buffer has been used (see section The Current Buffer). As for non-selected frames, the window selected within the frame becomes the selected window if the frame is ever selected. See section Selecting Windows.

Function: selected-window

This function returns the selected window (which is always a live window).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.2 Windows and Frames

Each window belongs to exactly one frame (see section Frames).

Function: window-frame &optional window

This function returns the frame that the window window belongs to. If window is nil, it defaults to the selected window.

Function: window-list &optional frame minibuffer window

This function returns a list of live windows belonging to the frame frame. If frame is omitted or nil, it defaults to the selected frame.

The optional argument minibuffer specifies whether to include the minibuffer window in the returned list. If minibuffer is t, the minibuffer window is included. If minibuffer is nil or omitted, the minibuffer window is included only if it is active. If minibuffer is neither nil nor t, the minibuffer window is never included.

The optional argument window, if non-nil, should be a live window on the specified frame; then window will be the first element in the returned list. If window is omitted or nil, the window selected within the frame is the first element.

Windows in the same frame are organized into a window tree, whose leaf nodes are the live windows. The internal nodes of a window tree are not live; they exist for the purpose of organizing the relationships between live windows. The root node of a window tree is called the root window. It can be either a live window (if the frame has just one window), or an internal window.

A minibuffer window (see section Minibuffer Windows) is not part of its frame’s window tree unless the frame is a minibuffer-only frame. Nonetheless, most of the functions in this section accept the minibuffer window as an argument. Also, the function window-tree described at the end of this section lists the minibuffer window alongside the actual window tree.

Function: frame-root-window &optional frame-or-window

This function returns the root window for frame-or-window. The argument frame-or-window should be either a window or a frame; if omitted or nil, it defaults to the selected frame. If frame-or-window is a window, the return value is the root window of that window’s frame.

When a window is split, there are two live windows where previously there was one. One of these is represented by the same Lisp window object as the original window, and the other is represented by a newly-created Lisp window object. Both of these live windows become leaf nodes of the window tree, as child windows of a single internal window. If necessary, Emacs automatically creates this internal window, which is also called the parent window, and assigns it to the appropriate position in the window tree. A set of windows that share the same parent are called siblings.

Function: window-parent &optional window

This function returns the parent window of window. If window is omitted or nil, it defaults to the selected window. The return value is nil if window has no parent (i.e., it is a minibuffer window or the root window of its frame).

Each internal window always has at least two child windows. If this number falls to one as a result of window deletion, Emacs automatically deletes the internal window, and its sole remaining child window takes its place in the window tree.

Each child window can be either a live window, or an internal window (which in turn would have its own child windows). Therefore, each internal window can be thought of as occupying a certain rectangular screen area—the union of the areas occupied by the live windows that are ultimately descended from it.

For each internal window, the screen areas of the immediate children are arranged either vertically or horizontally (never both). If the child windows are arranged one above the other, they are said to form a vertical combination; if they are arranged side by side, they are said to form a horizontal combination. Consider the following example:

     ______________________________________
    | ______  ____________________________ |
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W4____________|||
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W5____________|||
    ||__W2__||_____________W3_____________ |
    |__________________W1__________________|

The root window of this frame is an internal window, W1. Its child windows form a horizontal combination, consisting of the live window W2 and the internal window W3. The child windows of W3 form a vertical combination, consisting of the live windows W4 and W5. Hence, the live windows in this window tree are W2, W4, and W5.

The following functions can be used to retrieve a child window of an internal window, and the siblings of a child window.

Function: window-top-child &optional window

This function returns the topmost child window of window, if window is an internal window whose children form a vertical combination. For any other type of window, the return value is nil.

Function: window-left-child &optional window

This function returns the leftmost child window of window, if window is an internal window whose children form a horizontal combination. For any other type of window, the return value is nil.

Function: window-child window

This function returns the first child window of the internal window window—the topmost child window for a vertical combination, or the leftmost child window for a horizontal combination. If window is a live window, the return value is nil.

Function: window-combined-p &optional window horizontal

This function returns a non-nil value if and only if window is part of a vertical combination. If window is omitted or nil, it defaults to the selected one.

If the optional argument horizontal is non-nil, this means to return non-nil if and only if window is part of a horizontal combination.

Function: window-next-sibling &optional window

This function returns the next sibling of the window window. If omitted or nil, window defaults to the selected window. The return value is nil if window is the last child of its parent.

Function: window-prev-sibling &optional window

This function returns the previous sibling of the window window. If omitted or nil, window defaults to the selected window. The return value is nil if window is the first child of its parent.

The functions window-next-sibling and window-prev-sibling should not be confused with the functions next-window and previous-window, which return the next and previous window, respectively, in the cyclic ordering of windows (see section Cyclic Ordering of Windows).

You can use the following functions to find the first live window on a frame and the window nearest to a given window.

Function: frame-first-window &optional frame-or-window

This function returns the live window at the upper left corner of the frame specified by frame-or-window. The argument frame-or-window must denote a window or a live frame and defaults to the selected frame. If frame-or-window specifies a window, this function returns the first window on that window’s frame. Under the assumption that the frame from our canonical example is selected (frame-first-window) returns W2.

Function: window-in-direction direction &optional window ignore sign wrap mini

This function returns the nearest live window in direction direction as seen from the position of window-point in window window. The argument direction must be one of above, below, left or right. The optional argument window must denote a live window and defaults to the selected one.

This function does not return a window whose no-other-window parameter is non-nil (see section Window Parameters). If the nearest window’s no-other-window parameter is non-nil, this function tries to find another window in the indicated direction whose no-other-window parameter is nil. If the optional argument ignore is non-nil, a window may be returned even if its no-other-window parameter is non-nil.

If the optional argument sign is a negative number, it means to use the right or bottom edge of window as reference position instead of window-point. If sign is a positive number, it means to use the left or top edge of window as reference position.

If the optional argument wrap is non-nil, this means to wrap direction around frame borders. For example, if window is at the top of the frame and direction is above, then return the minibuffer window provided the frame has one, and a window at the bottom of the frame otherwise.

If the optional argument mini is nil, this means to return the minibuffer window if and only if it is currently active. If mini is non-nil, it returns the minibuffer window even when it’s not active. However, if wrap non-nil, it always acts as if mini were nil.

If it doesn’t find a suitable window, this function returns nil.

The following function allows to retrieve the entire window tree of a frame:

Function: window-tree &optional frame

This function returns a list representing the window tree for frame frame. If frame is omitted or nil, it defaults to the selected frame.

The return value is a list of the form (root mini), where root represents the window tree of the frame’s root window, and mini is the frame’s minibuffer window.

If the root window is live, root is that window itself. Otherwise, root is a list (dir edges w1 w2 ...) where dir is nil for a horizontal combination and t for a vertical combination, edges gives the size and position of the combination, and the remaining elements are the child windows. Each child window may again be a window object (for a live window) or a list with the same format as above (for an internal window). The edges element is a list (left top right bottom), similar to the value returned by window-edges (see section Coordinates and Windows).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.3 Window Sizes

The following schematic shows the structure of a live window:

        ____________________________________________
       |______________ Header Line ______________|RD| ^
     ^ |LS|LF|LM|                       |RM|RF|RS|  | |
     | |  |  |  |                       |  |  |  |  | |
Window |  |  |  |       Text Area       |  |  |  |  | Window
Body | |  |  |  |     (Window Body)     |  |  |  |  | Total
Height |  |  |  |                       |  |  |  |  | Height
     | |  |  |  |<- Window Body Width ->|  |  |  |  | |
     v |__|__|__|_______________________|__|__|__|  | |
       |_______________ Mode Line _______________|__| |
       |_____________ Bottom Divider _______________| v
        <---------- Window Total Width ------------>

At the center of the window is the text area, or body, where the buffer text is displayed. The text area can be surrounded by a series of optional areas. On the left and right, from innermost to outermost, these are the left and right margins, denoted by LM and RM in the schematic (see section Displaying in the Margins); the left and right fringes, denoted by LF and RF (see section Fringes); the left or right scroll bar, only one of which is present at any time, denoted by LS and RS (see section Scroll Bars); and the right divider, denoted by RD (see section Window Dividers). At the top of the window is the header line (see section Window Header Lines); at the bottom of the window is the mode line (see section Mode Line Format) followed by the bottom divider (see section Window Dividers).

Emacs provides miscellaneous functions for finding the height and width of a window. The return value of many of these functions can be specified either in units of pixels or in units of lines and columns. On a graphical display, the latter actually correspond to the height and width of a “default” character specified by the frame’s default font as returned by frame-char-height and frame-char-width (see section Frame Size And Position). Thus, if a window is displaying text with a different font or size, the reported line height and column width for that window may differ from the actual number of text lines or columns displayed within it.

The total height of a window is the number of lines comprising the window’s body, the header line, the mode line and the bottom divider (if any). Note that the height of a frame is not the same as the height of its root window (see section Windows and Frames), since a frame may also contain an echo area, a menu bar, and a tool bar (see section Frame Size And Position).

Function: window-total-height &optional window round

This function returns the total height, in lines, of the window window. If window is omitted or nil, it defaults to the selected window. If window is an internal window, the return value is the total height occupied by its descendant windows.

If a window’s pixel height is not an integral multiple of its frame’s default character height, the number of lines occupied by the window is rounded internally. This is done in a way such that, if the window is a parent window, the sum of the total heights of all its child windows internally equals the total height of their parent. This means that although two windows have the same pixel height, their internal total heights may differ by one line. This means also, that if this window is vertically combined and has a right sibling, the topmost row of that sibling can be calculated as the sum of this window’s topmost row and total height (see section Coordinates and Windows)

If the optional argument round is ceiling, this function returns the smallest integer larger than window’s pixel height divided by the character height of its frame; if it is floor, it returns the largest integer smaller than said value; with any other round it returns the internal value of windows’s total height.

The total width of a window is the number of lines comprising the window’s body, its margins, fringes, scroll bars and a right divider (if any).

Function: window-total-width &optional window round

This function returns the total width, in columns, of the window window. If window is omitted or nil, it defaults to the selected window. If window is internal, the return value is the total width occupied by its descendant windows.

If a window’s pixel width is not an integral multiple of its frame’s character width, the number of lines occupied by the window is rounded internally. This is done in a way such that, if the window is a parent window, the sum of the total widths of all its children internally equals the total width of their parent. This means that although two windows have the same pixel width, their internal total widths may differ by one column. This means also, that if this window is horizontally combined and has a right sibling, the leftmost column of that sibling can be calculated as the sum of this window’s leftmost column and total width (see section Coordinates and Windows). The optional argument round behaves as it does for window-total-height.

Function: window-total-size &optional window horizontal round

This function returns either the total height in lines or the total width in columns of the window window. If horizontal is omitted or nil, this is equivalent to calling window-total-height for window; otherwise it is equivalent to calling window-total-width for window. The optional argument round behaves as it does for window-total-height.

The following two functions can be used to return the total size of a window in units of pixels.

Function: window-pixel-height &optional window

This function returns the total height of window window in pixels. window must be a valid window and defaults to the selected one.

The return value includes mode and header line and a bottom divider, if any. If window is an internal window, its pixel height is the pixel height of the screen areas spanned by its children.

Function: window-pixel-width &optional Lisp_Object &optional window

This function returns the width of window window in pixels. window must be a valid window and defaults to the selected one.

The return value includes the fringes and margins of window as well as any vertical dividers or scroll bars belonging to window. If window is an internal window, its pixel width is the width of the screen areas spanned by its children.

The following functions can be used to determine whether a given window has any adjacent windows.

Function: window-full-height-p &optional window

This function returns non-nil if window has no other window above or below it in its frame, i.e., its total height equals the total height of the root window on that frame. If window is omitted or nil, it defaults to the selected window.

Function: window-full-width-p &optional window

This function returns non-nil if window has no other window to the left or right in its frame, i.e., its total width equals that of the root window on that frame. If window is omitted or nil, it defaults to the selected window.

The body height of a window is the height of its text area, which does not include a mode or header line or a bottom divider.

Function: window-body-height &optional window pixelwise

This function returns the height, in lines, of the body of window window. If window is omitted or nil, it defaults to the selected window; otherwise it must be a live window.

If the optional argument pixelwise is non-nil, this function returns the body height of window counted in pixels.

If pixelwise is nil, the return value is rounded down to the nearest integer, if necessary. This means that if a line at the bottom of the text area is only partially visible, that line is not counted. It also means that the height of a window’s body can never exceed its total height as returned by window-total-height.

The body width of a window is the width of its text area, which does not include the scroll bar, fringes, margins or a right divider.

Function: window-body-width &optional window pixelwise

This function returns the width, in columns, of the body of window window. If window is omitted or nil, it defaults to the selected window; otherwise it must be a live window.

If the optional argument pixelwise is non-nil, this function returns the body width of window in units of pixels.

If pixelwise is nil, the return value is rounded down to the nearest integer, if necessary. This means that if a column on the right of the text area is only partially visible, that column is not counted. It also means that the width of a window’s body can never exceed its total width as returned by window-total-width.

Function: window-body-size &optional window horizontal pixelwise

This function returns the body height or body width of window. If horizontal is omitted or nil, it is equivalent to calling window-body-height for window; otherwise it is equivalent to calling window-body-width. In either case, the optional argument pixelwise is passed to the function called.

For compatibility with previous versions of Emacs, window-height is an alias for window-total-height, and window-width is an alias for window-body-width. These aliases are considered obsolete and will be removed in the future.

The pixel heights of a window’s mode and header line can be retrieved with the functions given below. Their return value is usually accurate unless the window has not been displayed before: In that case, the return value is based on an estimate of the font used for the window’s frame.

Function: window-mode-line-height &optional window

This function returns the height in pixels of window’s mode line. window must be a live window and defaults to the selected one. If window has no mode line, the return value is zero.

Function: window-header-line-height &optional window

This function returns the height in pixels of window’s header line. window must be a live window and defaults to the selected one. If window has no header line, the return value is zero.

Functions for retrieving the height and/or width of window dividers (see section Window Dividers), fringes (see section Fringes), scroll bars (see section Scroll Bars), and display margins (see section Displaying in the Margins) are described in the corresponding sections.

Commands that change the size of windows (see section Resizing Windows), or split them (see section Splitting Windows), obey the variables window-min-height and window-min-width, which specify the smallest allowable window height and width. They also obey the variable window-size-fixed, with which a window can be fixed in size:

User Option: window-min-height

This option specifies the minimum total height, in lines, of any window. Its value has to accommodate at least one text line as well as a mode and header line and a bottom divider, if present.

User Option: window-min-width

This option specifies the minimum total width, in columns, of any window. Its value has to accommodate two text columns as well as margins, fringes, a scroll bar and a right divider, if present.

Variable: window-size-fixed

If this buffer-local variable is non-nil, the size of any window displaying the buffer cannot normally be changed. Deleting a window or changing the frame’s size may still change its size, if there is no choice.

If the value is height, then only the window’s height is fixed; if the value is width, then only the window’s width is fixed. Any other non-nil value fixes both the width and the height.

If this variable is nil, this does not necessarily mean that any window showing the buffer can be resized in the desired direction. To determine that, use the function window-resizable. See section Resizing Windows.

The following function tells how small a specific window can get taking into account the sizes of its areas and the values of window-min-height, window-min-width and window-size-fixed.

Function: window-min-size &optional window horizontal ignore pixelwise

This function returns the minimum size of window. window must be a valid window and defaults to the selected one. The optional argument horizontal non-nil means to return the minimum number of columns of window; otherwise return the minimum number of window’s lines.

The return value makes sure that all components of window remain fully visible if window’s size were actually set to it. With horizontal nil it includes the mode and header line and the bottom divider. With horizontal non-nil it includes the fringes, a scroll bar, and a right divider, if present. It does not, however, include the space reserved for the margins.

The optional argument ignore, if non-nil, means ignore restrictions imposed by fixed size windows, window-min-height or window-min-width settings. If ignore equals safe, live windows may get as small as window-safe-min-height lines and window-safe-min-width columns. If ignore is a window, ignore restrictions for that window only. Any other non-nil value means ignore all of the above restrictions for all windows.

The optional argument pixelwise non-nil means to return the minimum size of window counted in pixels.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.4 Resizing Windows

This section describes functions for resizing a window without changing the size of its frame. Because live windows do not overlap, these functions are meaningful only on frames that contain two or more windows: resizing a window also changes the size of a neighboring window. If there is just one window on a frame, its size cannot be changed except by resizing the frame (see section Frame Size And Position).

Except where noted, these functions also accept internal windows as arguments. Resizing an internal window causes its child windows to be resized to fit the same space.

Function: window-resizable window delta &optional horizontal ignore pixelwise

This function returns delta if the size of window can be changed vertically by delta lines. If the optional argument horizontal is non-nil, it instead returns delta if window can be resized horizontally by delta columns. It does not actually change the window size.

If window is nil, it defaults to the selected window.

A positive value of delta means to check whether the window can be enlarged by that number of lines or columns; a negative value of delta means to check whether the window can be shrunk by that many lines or columns. If delta is non-zero, a return value of 0 means that the window cannot be resized.

Normally, the variables window-min-height and window-min-width specify the smallest allowable window size (see section Window Sizes). However, if the optional argument ignore is non-nil, this function ignores window-min-height and window-min-width, as well as window-size-fixed. Instead, it considers the minimum-height window to be one consisting of a header, a mode line and a bottom divider (if any), plus a text area one line tall; and a minimum-width window as one consisting of fringes, margins, a scroll bar and a right divider (if any), plus a text area two columns wide.

If the optional argument pixelwise is non-nil, delta is interpreted as pixels.

Function: window-resize window delta &optional horizontal ignore pixelwise

This function resizes window by delta increments. If horizontal is nil, it changes the height by delta lines; otherwise, it changes the width by delta columns. A positive delta means to enlarge the window, and a negative delta means to shrink it.

If window is nil, it defaults to the selected window. If the window cannot be resized as demanded, an error is signaled.

The optional argument ignore has the same meaning as for the function window-resizable above.

If the optional argument pixelwise is non-nil, delta will be interpreted as pixels.

The choice of which window edges this function alters depends on the values of the option window-combination-resize and the combination limits of the involved windows; in some cases, it may alter both edges. See section Recombining Windows. To resize by moving only the bottom or right edge of a window, use the function adjust-window-trailing-edge.

Function: adjust-window-trailing-edge window delta &optional horizontal pixelwise

This function moves window’s bottom edge by delta lines. If optional argument horizontal is non-nil, it instead moves the right edge by delta columns. If window is nil, it defaults to the selected window.

If the optional argument pixelwise is non-nil, delta is interpreted as pixels.

A positive delta moves the edge downwards or to the right; a negative delta moves it upwards or to the left. If the edge cannot be moved as far as specified by delta, this function moves it as far as possible but does not signal a error.

This function tries to resize windows adjacent to the edge that is moved. If this is not possible for some reason (e.g., if that adjacent window is fixed-size), it may resize other windows.

User Option: window-resize-pixelwise

If the value of this option is non-nil, Emacs resizes windows in units of pixels. This currently affects functions like split-window (see section Splitting Windows), maximize-window, minimize-window, fit-window-to-buffer, shrink-window-if-larger-than-buffer (all listed below) and fit-frame-to-buffer (see section Frame Size And Position).

Note that when a frame’s pixel size is not a multiple of its character size, at least one window may get resized pixelwise even if this option is nil. The default value is nil.

The following commands resize windows in more specific ways. When called interactively, they act on the selected window.

Command: fit-window-to-buffer &optional window max-height min-height max-width min-width

This command adjusts the height or width of window to fit the text in it. It returns non-nil if it was able to resize window, and nil otherwise. If window is omitted or nil, it defaults to the selected window. Otherwise, it should be a live window.

If window is part of a vertical combination, this function adjusts window’s height. The new height is calculated from the actual height of the accessible portion of its buffer. The optional argument max-height, if non-nil, specifies the maximum total height that this function can give window. The optional argument min-height, if non-nil, specifies the minimum total height that it can give, which overrides the variable window-min-height. Both max-height and min-height are specified in lines and include mode and header line and a bottom divider, if any.

If window is part of a horizontal combination and the value of the option fit-window-to-buffer-horizontally (see below) is non-nil, this function adjusts window’s height. The new width of window is calculated from the maximum length of its buffer’s lines that follow the current start position of window. The optional argument max-width specifies a maximum width and defaults to the width of window’s frame. The optional argument min-width specifies a minimum width and defaults to window-min-width. Both max-width and min-width are specified in columns and include fringes, margins and scrollbars, if any.

If the option fit-frame-to-buffer (see below) is non-nil, this function will try to resize the frame of window to fit its contents by calling fit-frame-to-buffer (see section Frame Size And Position).

User Option: fit-window-to-buffer-horizontally

If this is non-nil, fit-window-to-buffer can resize windows horizontally. If this is nil (the default) fit-window-to-buffer never resizes windows horizontally. If this is only, it can resize windows horizontally only. Any other value means fit-window-to-buffer can resize windows in both dimensions.

User Option: fit-frame-to-buffer

If this option is non-nil, fit-window-to-buffer can fit a frame to its buffer. A frame is fit if and only if its root window is a live window and this option is non-nil. If this is horizontally, frames are fit horizontally only. If this is vertically, frames are fit vertically only. Any other non-nil value means frames can be resized in both dimensions.

Command: shrink-window-if-larger-than-buffer &optional window

This command attempts to reduce window’s height as much as possible while still showing its full buffer, but no less than window-min-height lines. The return value is non-nil if the window was resized, and nil otherwise. If window is omitted or nil, it defaults to the selected window. Otherwise, it should be a live window.

This command does nothing if the window is already too short to display all of its buffer, or if any of the buffer is scrolled off-screen, or if the window is the only live window in its frame.

This command calls fit-window-to-buffer (see above) to do its work.

Command: balance-windows &optional window-or-frame

This function balances windows in a way that gives more space to full-width and/or full-height windows. If window-or-frame specifies a frame, it balances all windows on that frame. If window-or-frame specifies a window, it balances only that window and its siblings (see section Windows and Frames).

Command: balance-windows-area

This function attempts to give all windows on the selected frame approximately the same share of the screen area. Full-width or full-height windows are not given more space than other windows.

Command: maximize-window &optional window

This function attempts to make window as large as possible, in both dimensions, without resizing its frame or deleting other windows. If window is omitted or nil, it defaults to the selected window.

Command: minimize-window &optional window

This function attempts to make window as small as possible, in both dimensions, without deleting it or resizing its frame. If window is omitted or nil, it defaults to the selected window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.5 Splitting Windows

This section describes functions for creating a new window by splitting an existing one.

Function: split-window &optional window size side pixelwise

This function creates a new live window next to the window window. If window is omitted or nil, it defaults to the selected window. That window is “split”, and reduced in size. The space is taken up by the new window, which is returned.

The optional second argument size determines the sizes of window and/or the new window. If it is omitted or nil, both windows are given equal sizes; if there is an odd line, it is allocated to the new window. If size is a positive number, window is given size lines (or columns, depending on the value of side). If size is a negative number, the new window is given -size lines (or columns).

If size is nil, this function obeys the variables window-min-height and window-min-width (see section Window Sizes). Thus, it signals an error if splitting would result in making a window smaller than those variables specify. However, a non-nil value for size causes those variables to be ignored; in that case, the smallest allowable window is considered to be one that has space for a text area one line tall and/or two columns wide.

Hence, if size is specified, it’s the caller’s responsibility to check whether the emanating windows are large enough to encompass all areas like a mode line or a scroll bar. The function window-min-size (see section Window Sizes) can be used to determine the minimum requirements of window in this regard. Since the new window usually “inherits” areas like the mode line or the scroll bar from window, that function is also a good guess for the minimum size of the new window. The caller should specify a smaller size only if it correspondingly removes an inherited area before the next redisplay.

The optional third argument side determines the position of the new window relative to window. If it is nil or below, the new window is placed below window. If it is above, the new window is placed above window. In both these cases, size specifies a total window height, in lines.

If side is t or right, the new window is placed on the right of window. If side is left, the new window is placed on the left of window. In both these cases, size specifies a total window width, in columns.

The optional fourth argument pixelwise, if non-nil, means to interpret size in units of pixels, instead of lines and columns.

If window is a live window, the new window inherits various properties from it, including margins and scroll bars. If window is an internal window, the new window inherits the properties of the window selected within window’s frame.

The behavior of this function may be altered by the window parameters of window, so long as the variable ignore-window-parameters is nil. If the value of the split-window window parameter is t, this function ignores all other window parameters. Otherwise, if the value of the split-window window parameter is a function, that function is called with the arguments window, size, and side, in lieu of the usual action of split-window. Otherwise, this function obeys the window-atom or window-side window parameter, if any. See section Window Parameters.

As an example, here is a sequence of split-window calls that yields the window configuration discussed in Windows and Frames. This example demonstrates splitting a live window as well as splitting an internal window. We begin with a frame containing a single window (a live root window), which we denote by W4. Calling (split-window W4) yields this window configuration:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W5_________________||
    |__________________W3__________________|

The split-window call has created a new live window, denoted by W5. It has also created a new internal window, denoted by W3, which becomes the root window and the parent of both W4 and W5.

Next, we call (split-window W3 nil 'left), passing the internal window W3 as the argument. The result:

     ______________________________________
    | ______  ____________________________ |
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W4____________|||
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W5____________|||
    ||__W2__||_____________W3_____________ |
    |__________________W1__________________|

A new live window W2 is created, to the left of the internal window W3. A new internal window W1 is created, becoming the new root window.

For interactive use, Emacs provides two commands which always split the selected window. These call split-window internally.

Command: split-window-right &optional size

This function splits the selected window into two side-by-side windows, putting the selected window on the left. If size is positive, the left window gets size columns; if size is negative, the right window gets -size columns.

Command: split-window-below &optional size

This function splits the selected window into two windows, one above the other, leaving the upper window selected. If size is positive, the upper window gets size lines; if size is negative, the lower window gets -size lines.

User Option: split-window-keep-point

If the value of this variable is non-nil (the default), split-window-below behaves as described above.

If it is nil, split-window-below adjusts point in each of the two windows to minimize redisplay. (This is useful on slow terminals.) It selects whichever window contains the screen line that point was previously on. Note that this only affects split-window-below, not the lower-level split-window function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.6 Deleting Windows

Deleting a window removes it from the frame’s window tree. If the window is a live window, it disappears from the screen. If the window is an internal window, its child windows are deleted too.

Even after a window is deleted, it continues to exist as a Lisp object, until there are no more references to it. Window deletion can be reversed, by restoring a saved window configuration (see section Window Configurations).

Command: delete-window &optional window

This function removes window from display and returns nil. If window is omitted or nil, it defaults to the selected window. If deleting the window would leave no more windows in the window tree (e.g., if it is the only live window in the frame), an error is signaled.

By default, the space taken up by window is given to one of its adjacent sibling windows, if any. However, if the variable window-combination-resize is non-nil, the space is proportionally distributed among any remaining windows in the window combination. See section Recombining Windows.

The behavior of this function may be altered by the window parameters of window, so long as the variable ignore-window-parameters is nil. If the value of the delete-window window parameter is t, this function ignores all other window parameters. Otherwise, if the value of the delete-window window parameter is a function, that function is called with the argument window, in lieu of the usual action of delete-window. Otherwise, this function obeys the window-atom or window-side window parameter, if any. See section Window Parameters.

Command: delete-other-windows &optional window

This function makes window fill its frame, by deleting other windows as necessary. If window is omitted or nil, it defaults to the selected window. The return value is nil.

The behavior of this function may be altered by the window parameters of window, so long as the variable ignore-window-parameters is nil. If the value of the delete-other-windows window parameter is t, this function ignores all other window parameters. Otherwise, if the value of the delete-other-windows window parameter is a function, that function is called with the argument window, in lieu of the usual action of delete-other-windows. Otherwise, this function obeys the window-atom or window-side window parameter, if any. See section Window Parameters.

Command: delete-windows-on &optional buffer-or-name frame

This function deletes all windows showing buffer-or-name, by calling delete-window on those windows. buffer-or-name should be a buffer, or the name of a buffer; if omitted or nil, it defaults to the current buffer. If there are no windows showing the specified buffer, this function does nothing. If the specified buffer is a minibuffer, an error is signaled.

If there is a dedicated window showing the buffer, and that window is the only one on its frame, this function also deletes that frame if it is not the only frame on the terminal.

The optional argument frame specifies which frames to operate on:

Note that this argument does not have the same meaning as in other functions which scan all live windows (see section Cyclic Ordering of Windows). Specifically, the meanings of t and nil here are the opposite of what they are in those other functions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.7 Recombining Windows

When deleting the last sibling of a window W, its parent window is deleted too, with W replacing it in the window tree. This means that W must be recombined with its parent’s siblings to form a new window combination (see section Windows and Frames). In some occasions, deleting a live window may even entail the deletion of two internal windows.

     ______________________________________
    | ______  ____________________________ |
    ||      || __________________________ ||
    ||      ||| ___________  ___________ |||
    ||      ||||           ||           ||||
    ||      ||||____W6_____||_____W7____||||
    ||      |||____________W4____________|||
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W5____________|||
    ||__W2__||_____________W3_____________ |
    |__________________W1__________________|

Deleting W5 in this configuration normally causes the deletion of W3 and W4. The remaining live windows W2, W6 and W7 are recombined to form a new horizontal combination with parent W1.

Sometimes, however, it makes sense to not delete a parent window like W4. In particular, a parent window should not be removed when it was used to preserve a combination embedded in a combination of the same type. Such embeddings make sense to assure that when you split a window and subsequently delete the new window, Emacs reestablishes the layout of the associated frame as it existed before the splitting.

Consider a scenario starting with two live windows W2 and W3 and their parent W1.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

Split W2 to make a new window W4 as follows.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

Now, when enlarging a window vertically, Emacs tries to obtain the corresponding space from its lower sibling, provided such a window exists. In our scenario, enlarging W4 will steal space from W3.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||_________________W3_________________||
    |__________________W1__________________|

Deleting W4 will now give its entire space to W2, including the space earlier stolen from W3.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||_________________W3_________________||
    |__________________W1__________________|

This can be counterintuitive, in particular if W4 were used for displaying a buffer only temporarily (see section Temporary Displays), and you want to continue working with the initial layout.

The behavior can be fixed by making a new parent window when splitting W2. The variable described next allows to do that.

User Option: window-combination-limit

This variable controls whether splitting a window shall make a new parent window. The following values are recognized:

nil

This means that the new live window is allowed to share the existing parent window, if one exists, provided the split occurs in the same direction as the existing window combination (otherwise, a new internal window is created anyway).

window-size

In this case display-buffer makes a new parent window if it is passed a window-height or window-width entry in the alist argument (see section Action Functions for display-buffer).

temp-buffer

This value causes the creation of a new parent window when a window is split for showing a temporary buffer (see section Temporary Displays) only.

display-buffer

This means that when display-buffer (see section Choosing a Window for Display) splits a window it always makes a new parent window.

t

In this case a new parent window is always created when splitting a window. Thus, if the value of this variable is at all times t, then at all times every window tree is a binary tree (a tree where each window except the root window has exactly one sibling).

The default is nil. Other values are reserved for future use.

If, as a consequence of this variable’s setting, split-window makes a new parent window, it also calls set-window-combination-limit (see below) on the newly-created internal window. This affects how the window tree is rearranged when the child windows are deleted (see below).

If window-combination-limit is t, splitting W2 in the initial configuration of our scenario would have produced this:

     ______________________________________
    | ____________________________________ |
    || __________________________________ ||
    |||                                  |||
    |||________________W2________________|||
    || __________________________________ ||
    |||                                  |||
    |||________________W4________________|||
    ||_________________W5_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

A new internal window W5 has been created; its children are W2 and the new live window W4. Now, W2 is the only sibling of W4, so enlarging W4 will try to shrink W2, leaving W3 unaffected. Observe that W5 represents a vertical combination of two windows embedded in the vertical combination W1.

Function: set-window-combination-limit window limit

This function sets the combination limit of the window window to limit. This value can be retrieved via the function window-combination-limit. See below for its effects; note that it is only meaningful for internal windows. The split-window function automatically calls this function, passing it t as limit, provided the value of the variable window-combination-limit is t when it is called.

Function: window-combination-limit window

This function returns the combination limit for window.

The combination limit is meaningful only for an internal window. If it is nil, then Emacs is allowed to automatically delete window, in response to a window deletion, in order to group the child windows of window with its sibling windows to form a new window combination. If the combination limit is t, the child windows of window are never automatically recombined with its siblings.

If, in the configuration shown at the beginning of this section, the combination limit of W4 (the parent window of W6 and W7) is t, deleting W5 will not implicitly delete W4 too.

Alternatively, the problems sketched above can be avoided by always resizing all windows in the same combination whenever one of its windows is split or deleted. This also permits to split windows that would be otherwise too small for such an operation.

User Option: window-combination-resize

If this variable is nil, split-window can only split a window (denoted by window) if window’s screen area is large enough to accommodate both itself and the new window.

If this variable is t, split-window tries to resize all windows that are part of the same combination as window, in order to accommodate the new window. In particular, this may allow split-window to succeed even if window is a fixed-size window or too small to ordinarily split. Furthermore, subsequently resizing or deleting window may resize all other windows in its combination.

The default is nil. Other values are reserved for future use. The value of this variable is ignored when window-combination-limit is non-nil.

To illustrate the effect of window-combination-resize, consider the following frame layout.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

If window-combination-resize is nil, splitting window W3 leaves the size of W2 unchanged:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||_________________W3_________________||
    | ____________________________________ |
    ||                                    ||
    ||_________________W4_________________||
    |__________________W1__________________|

If window-combination-resize is t, splitting W3 instead leaves all three live windows with approximately the same height:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    |__________________W1__________________|

Deleting any of the live windows W2, W3 or W4 will distribute its space proportionally among the two remaining live windows.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.8 Selecting Windows

Function: select-window window &optional norecord

This function makes window the selected window and the window selected within its frame (see section Basic Concepts of Emacs Windows) and selects that frame. It also makes window’s buffer (see section Buffers and Windows) current and sets that buffer’s value of point to the value of window-point (see section Windows and Point) in window. window must be a live window. The return value is window.

By default, this function also moves window’s buffer to the front of the buffer list (see section The Buffer List), and makes window the most recently selected window. However, if the optional argument norecord is non-nil, these additional actions are omitted.

This function runs buffer-list-update-hook (see section The Buffer List) unless norecord is non-nil. Note that applications and internal routines often temporarily select a window in order to simplify coding. As a rule, such selections (including those made by the macros save-selected-window and with-selected-window below) are not recorded thus avoiding to pollute buffer-list-update-hook. Selections that “really count” are those causing a visible change in the next redisplay of window’s frame and should be always recorded. This also means that to run a function each time a window gets selected, putting it on buffer-list-update-hook should be the right choice.

The sequence of calls to select-window with a non-nil norecord argument determines an ordering of windows by their selection time. The function get-lru-window can be used to retrieve the least recently selected live window (see section Cyclic Ordering of Windows).

Macro: save-selected-window forms…

This macro records the selected frame, as well as the selected window of each frame, executes forms in sequence, then restores the earlier selected frame and windows. It also saves and restores the current buffer. It returns the value of the last form in forms.

This macro does not save or restore anything about the sizes, arrangement or contents of windows; therefore, if forms change them, the change persists. If the previously selected window of some frame is no longer live at the time of exit from forms, that frame’s selected window is left alone. If the previously selected window is no longer live, then whatever window is selected at the end of forms remains selected. The current buffer is restored if and only if it is still live when exiting forms.

This macro changes neither the ordering of recently selected windows nor the buffer list.

Macro: with-selected-window window forms…

This macro selects window, executes forms in sequence, then restores the previously selected window and current buffer. The ordering of recently selected windows and the buffer list remain unchanged unless you deliberately change them within forms; for example, by calling select-window with argument norecord nil.

This macro does not change the order of recently selected windows or the buffer list.

Function: frame-selected-window &optional frame

This function returns the window on frame that is selected within that frame. frame should be a live frame; if omitted or nil, it defaults to the selected frame.

Function: set-frame-selected-window frame window &optional norecord

This function makes window the window selected within the frame frame. frame should be a live frame; if nil, it defaults to the selected frame. window should be a live window; if nil, it defaults to the selected window.

If frame is the selected frame, this makes window the selected window.

If the optional argument norecord is non-nil, this function does not alter the list of most recently selected windows, nor the buffer list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.9 Cyclic Ordering of Windows

When you use the command C-x o (other-window) to select some other window, it moves through live windows in a specific order. For any given configuration of windows, this order never varies. It is called the cyclic ordering of windows.

The ordering is determined by a depth-first traversal of the frame’s window tree, retrieving the live windows which are the leaf nodes of the tree (see section Windows and Frames). If the minibuffer is active, the minibuffer window is included too. The ordering is cyclic, so the last window in the sequence is followed by the first one.

Function: next-window &optional window minibuf all-frames

This function returns a live window, the one following window in the cyclic ordering of windows. window should be a live window; if omitted or nil, it defaults to the selected window.

The optional argument minibuf specifies whether minibuffer windows should be included in the cyclic ordering. Normally, when minibuf is nil, a minibuffer window is included only if it is currently “active”; this matches the behavior of C-x o. (Note that a minibuffer window is active as long as its minibuffer is in use; see Minibuffers).

If minibuf is t, the cyclic ordering includes all minibuffer windows. If minibuf is neither t nor nil, minibuffer windows are not included even if they are active.

The optional argument all-frames specifies which frames to consider:

If more than one frame is considered, the cyclic ordering is obtained by appending the orderings for those frames, in the same order as the list of all live frames (see section Finding All Frames).

Function: previous-window &optional window minibuf all-frames

This function returns a live window, the one preceding window in the cyclic ordering of windows. The other arguments are handled like in next-window.

Command: other-window count &optional all-frames

This function selects a live window, one count places from the selected window in the cyclic ordering of windows. If count is a positive number, it skips count windows forwards; if count is negative, it skips -count windows backwards; if count is zero, that simply re-selects the selected window. When called interactively, count is the numeric prefix argument.

The optional argument all-frames has the same meaning as in next-window, like a nil minibuf argument to next-window.

This function does not select a window that has a non-nil no-other-window window parameter (see section Window Parameters).

Function: walk-windows fun &optional minibuf all-frames

This function calls the function fun once for each live window, with the window as the argument.

It follows the cyclic ordering of windows. The optional arguments minibuf and all-frames specify the set of windows included; these have the same arguments as in next-window. If all-frames specifies a frame, the first window walked is the first window on that frame (the one returned by frame-first-window), not necessarily the selected window.

If fun changes the window configuration by splitting or deleting windows, that does not alter the set of windows walked, which is determined prior to calling fun for the first time.

Function: one-window-p &optional no-mini all-frames

This function returns t if the selected window is the only live window, and nil otherwise.

If the minibuffer window is active, it is normally considered (so that this function returns nil). However, if the optional argument no-mini is non-nil, the minibuffer window is ignored even if active. The optional argument all-frames has the same meaning as for next-window.

The following functions return a window which satisfies some criterion, without selecting it:

Function: get-lru-window &optional all-frames dedicated not-selected

This function returns a live window which is heuristically the “least recently used” window. The optional argument all-frames has the same meaning as in next-window.

If any full-width windows are present, only those windows are considered. A minibuffer window is never a candidate. A dedicated window (see section Dedicated Windows) is never a candidate unless the optional argument dedicated is non-nil. The selected window is never returned, unless it is the only candidate. However, if the optional argument not-selected is non-nil, this function returns nil in that case.

Function: get-largest-window &optional all-frames dedicated not-selected

This function returns the window with the largest area (height times width). The optional argument all-frames specifies the windows to search, and has the same meaning as in next-window.

A minibuffer window is never a candidate. A dedicated window (see section Dedicated Windows) is never a candidate unless the optional argument dedicated is non-nil. The selected window is not a candidate if the optional argument not-selected is non-nil. If the optional argument not-selected is non-nil and the selected window is the only candidate, this function returns nil.

If there are two candidate windows of the same size, this function prefers the one that comes first in the cyclic ordering of windows, starting from the selected window.

Function: get-window-with-predicate predicate &optional minibuf all-frames default

This function calls the function predicate for each of the windows in the cyclic order of windows in turn, passing it the window as an argument. If the predicate returns non-nil for any window, this function stops and returns that window. If no such window is found, the return value is default (which defaults to nil).

The optional arguments minibuf and all-frames specify the windows to search, and have the same meanings as in next-window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.10 Buffers and Windows

This section describes low-level functions for examining and setting the contents of windows. See section Switching to a Buffer in a Window, for higher-level functions for displaying a specific buffer in a window.

Function: window-buffer &optional window

This function returns the buffer that window is displaying. If window is omitted or nil it defaults to the selected window. If window is an internal window, this function returns nil.

Function: set-window-buffer window buffer-or-name &optional keep-margins

This function makes window display buffer-or-name. window should be a live window; if nil, it defaults to the selected window. buffer-or-name should be a buffer, or the name of an existing buffer. This function does not change which window is selected, nor does it directly change which buffer is current (see section The Current Buffer). Its return value is nil.

If window is strongly dedicated to a buffer and buffer-or-name does not specify that buffer, this function signals an error. See section Dedicated Windows.

By default, this function resets window’s position, display margins, fringe widths, and scroll bar settings, based on the local variables in the specified buffer. However, if the optional argument keep-margins is non-nil, it leaves the display margins and fringe widths unchanged.

When writing an application, you should normally use the higher-level functions described in Switching to a Buffer in a Window, instead of calling set-window-buffer directly.

This runs window-scroll-functions, followed by window-configuration-change-hook. See section Hooks for Window Scrolling and Changes.

Variable: buffer-display-count

This buffer-local variable records the number of times a buffer has been displayed in a window. It is incremented each time set-window-buffer is called for the buffer.

Variable: buffer-display-time

This buffer-local variable records the time at which a buffer was last displayed in a window. The value is nil if the buffer has never been displayed. It is updated each time set-window-buffer is called for the buffer, with the value returned by current-time (see section Time of Day).

Function: get-buffer-window &optional buffer-or-name all-frames

This function returns the first window displaying buffer-or-name in the cyclic ordering of windows, starting from the selected window (see section Cyclic Ordering of Windows). If no such window exists, the return value is nil.

buffer-or-name should be a buffer or the name of a buffer; if omitted or nil, it defaults to the current buffer. The optional argument all-frames specifies which windows to consider:

Note that these meanings differ slightly from those of the all-frames argument to next-window (see section Cyclic Ordering of Windows). This function may be changed in a future version of Emacs to eliminate this discrepancy.

Function: get-buffer-window-list &optional buffer-or-name minibuf all-frames

This function returns a list of all windows currently displaying buffer-or-name. buffer-or-name should be a buffer or the name of an existing buffer. If omitted or nil, it defaults to the current buffer.

The arguments minibuf and all-frames have the same meanings as in the function next-window (see section Cyclic Ordering of Windows). Note that the all-frames argument does not behave exactly like in get-buffer-window.

Command: replace-buffer-in-windows &optional buffer-or-name

This command replaces buffer-or-name with some other buffer, in all windows displaying it. buffer-or-name should be a buffer, or the name of an existing buffer; if omitted or nil, it defaults to the current buffer.

The replacement buffer in each window is chosen via switch-to-prev-buffer (see section Window History). Any dedicated window displaying buffer-or-name is deleted if possible (see section Dedicated Windows). If such a window is the only window on its frame and there are other frames on the same terminal, the frame is deleted as well. If the dedicated window is the only window on the only frame on its terminal, the buffer is replaced anyway.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.11 Switching to a Buffer in a Window

This section describes high-level functions for switching to a specified buffer in some window. In general, “switching to a buffer” means to (1) show the buffer in some window, (2) make that window the selected window (and its frame the selected frame), and (3) make the buffer the current buffer.

Do not use these functions to make a buffer temporarily current just so a Lisp program can access or modify it. They have side-effects, such as changing window histories (see section Window History), which will surprise the user if used that way. If you want to make a buffer current to modify it in Lisp, use with-current-buffer, save-current-buffer, or set-buffer. See section The Current Buffer.

Command: switch-to-buffer buffer-or-name &optional norecord force-same-window

This command attempts to display buffer-or-name in the selected window and make it the current buffer. It is often used interactively (as the binding of C-x b), as well as in Lisp programs. The return value is the buffer switched to.

If buffer-or-name is nil, it defaults to the buffer returned by other-buffer (see section The Buffer List). If buffer-or-name is a string that is not the name of any existing buffer, this function creates a new buffer with that name; the new buffer’s major mode is determined by the variable major-mode (see section Major Modes).

Normally, the specified buffer is put at the front of the buffer list—both the global buffer list and the selected frame’s buffer list (see section The Buffer List). However, this is not done if the optional argument norecord is non-nil.

Sometimes, switch-to-buffer may be unable to display the buffer in the selected window. This happens if the selected window is a minibuffer window, or if the selected window is strongly dedicated to its buffer (see section Dedicated Windows). In that case, the command normally tries to display the buffer in some other window, by invoking pop-to-buffer (see below). However, if the optional argument force-same-window is non-nil, it signals an error instead.

By default, switch-to-buffer shows the buffer at its position of point. This behavior can be tuned using the following option.

User Option: switch-to-buffer-preserve-window-point

If this variable is nil, switch-to-buffer displays the buffer specified by buffer-or-name at the position of that buffer’s point. If this variable is already-displayed, it tries to display the buffer at its previous position in the selected window, provided the buffer is currently displayed in some other window on any visible or iconified frame. If this variable is t, switch-to-buffer unconditionally tries to display the buffer at its previous position in the selected window.

This variable is ignored if the buffer is already displayed in the selected window or never appeared in it before, or if switch-to-buffer calls pop-to-buffer to display the buffer.

The next two commands are similar to switch-to-buffer, except for the described features.

Command: switch-to-buffer-other-window buffer-or-name &optional norecord

This function displays the buffer specified by buffer-or-name in some window other than the selected window. It uses the function pop-to-buffer internally (see below).

If the selected window already displays the specified buffer, it continues to do so, but another window is nonetheless found to display it as well.

The buffer-or-name and norecord arguments have the same meanings as in switch-to-buffer.

Command: switch-to-buffer-other-frame buffer-or-name &optional norecord

This function displays the buffer specified by buffer-or-name in a new frame. It uses the function pop-to-buffer internally (see below).

If the specified buffer is already displayed in another window, in any frame on the current terminal, this switches to that window instead of creating a new frame. However, the selected window is never used for this.

The buffer-or-name and norecord arguments have the same meanings as in switch-to-buffer.

The above commands use the function pop-to-buffer, which flexibly displays a buffer in some window and selects that window for editing. In turn, pop-to-buffer uses display-buffer for displaying the buffer. Hence, all the variables affecting display-buffer will affect it as well. See section Choosing a Window for Display, for the documentation of display-buffer.

Command: pop-to-buffer buffer-or-name &optional action norecord

This function makes buffer-or-name the current buffer and displays it in some window, preferably not the window previously selected. It then selects the displaying window. If that window is on a different graphical frame, that frame is given input focus if possible (see section Input Focus). The return value is the buffer that was switched to.

If buffer-or-name is nil, it defaults to the buffer returned by other-buffer (see section The Buffer List). If buffer-or-name is a string that is not the name of any existing buffer, this function creates a new buffer with that name; the new buffer’s major mode is determined by the variable major-mode (see section Major Modes).

If action is non-nil, it should be a display action to pass to display-buffer (see section Choosing a Window for Display). Alternatively, a non-nil, non-list value means to pop to a window other than the selected one—even if the buffer is already displayed in the selected window.

Like switch-to-buffer, this function updates the buffer list unless norecord is non-nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.12 Choosing a Window for Display

The command display-buffer flexibly chooses a window for display, and displays a specified buffer in that window. It can be called interactively, via the key binding C-x 4 C-o. It is also used as a subroutine by many functions and commands, including switch-to-buffer and pop-to-buffer (see section Switching to a Buffer in a Window).

This command performs several complex steps to find a window to display in. These steps are described by means of display actions, which have the form (function . alist). Here, function is either a function or a list of functions, which we refer to as action functions; alist is an association list, which we refer to as action alists.

An action function accepts two arguments: the buffer to display and an action alist. It attempts to display the buffer in some window, picking or creating a window according to its own criteria. If successful, it returns the window; otherwise, it returns nil. See section Action Functions for display-buffer, for a list of predefined action functions.

display-buffer works by combining display actions from several sources, and calling the action functions in turn, until one of them manages to display the buffer and returns a non-nil value.

Command: display-buffer buffer-or-name &optional action frame

This command makes buffer-or-name appear in some window, without selecting the window or making the buffer current. The argument buffer-or-name must be a buffer or the name of an existing buffer. The return value is the window chosen to display the buffer.

The optional argument action, if non-nil, should normally be a display action (described above). display-buffer builds a list of action functions and an action alist, by consolidating display actions from the following sources (in order):

Each action function is called in turn, passing the buffer as the first argument and the combined action alist as the second argument, until one of the functions returns non-nil. The caller can pass (allow-no-window . t) as an element of the action alist to indicate its readiness to handle the case of not displaying the buffer in a window.

The argument action can also have a non-nil, non-list value. This has the special meaning that the buffer should be displayed in a window other than the selected one, even if the selected window is already displaying it. If called interactively with a prefix argument, action is t.

The optional argument frame, if non-nil, specifies which frames to check when deciding whether the buffer is already displayed. It is equivalent to adding an element (reusable-frames . frame) to the action alist of action. See section Action Functions for display-buffer.

Variable: display-buffer-overriding-action

The value of this variable should be a display action, which is treated with the highest priority by display-buffer. The default value is empty, i.e., (nil . nil).

User Option: display-buffer-alist

The value of this option is an alist mapping conditions to display actions. Each condition may be either a regular expression matching a buffer name or a function that takes two arguments: a buffer name and the action argument passed to display-buffer. If the name of the buffer passed to display-buffer either matches a regular expression in this alist or the function specified by a condition returns non-nil, then display-buffer uses the corresponding display action to display the buffer.

User Option: display-buffer-base-action

The value of this option should be a display action. This option can be used to define a “standard” display action for calls to display-buffer.

Constant: display-buffer-fallback-action

This display action specifies the fallback behavior for display-buffer if no other display actions are given.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.13 Action Functions for display-buffer

The following basic action functions are defined in Emacs. Each of these functions takes two arguments: buffer, the buffer to display, and alist, an action alist. Each action function returns the window if it succeeds, and nil if it fails.

Function: display-buffer-same-window buffer alist

This function tries to display buffer in the selected window. It fails if the selected window is a minibuffer window or is dedicated to another buffer (see section Dedicated Windows). It also fails if alist has a non-nil inhibit-same-window entry.

Function: display-buffer-reuse-window buffer alist

This function tries to “display” buffer by finding a window that is already displaying it.

If alist has a non-nil inhibit-same-window entry, the selected window is not eligible for reuse. If alist contains a reusable-frames entry, its value determines which frames to search for a reusable window:

Note that these meanings differ slightly from those of the all-frames argument to next-window (see section Cyclic Ordering of Windows).

If alist contains no reusable-frames entry, this function normally searches just the selected frame; however, if the variable pop-up-frames is non-nil, it searches all frames on the current terminal. See section Additional Options for Displaying Buffers.

If this function chooses a window on another frame, it makes that frame visible and, unless alist contains an inhibit-switch-frame entry (see section Additional Options for Displaying Buffers), raises that frame if necessary.

Function: display-buffer-pop-up-frame buffer alist

This function creates a new frame, and displays the buffer in that frame’s window. It actually performs the frame creation by calling the function specified in pop-up-frame-function (see section Additional Options for Displaying Buffers). If alist contains a pop-up-frame-parameters entry, the associated value is added to the newly created frame’s parameters.

Function: display-buffer-pop-up-window buffer alist

This function tries to display buffer by splitting the largest or least recently-used window (typically one on the selected frame). It actually performs the split by calling the function specified in split-window-preferred-function (see section Additional Options for Displaying Buffers).

The size of the new window can be adjusted by supplying window-height and window-width entries in alist. To adjust the window’s height, use an entry whose CAR is window-height and whose CDR is one of:

To adjust the window’s width, use an entry whose CAR is window-width and whose CDR is one of:

This function can fail if no window splitting can be performed for some reason (e.g., if the selected frame has an unsplittable frame parameter; see section Buffer Parameters).

Function: display-buffer-below-selected buffer alist

This function tries to display buffer in a window below the selected window. This means to either split the selected window or use the window below the selected one. If it does create a new window, it will also adjust its size provided alist contains a suitable window-height or window-width entry, see above.

Function: display-buffer-in-previous-window buffer alist

This function tries to display buffer in a window previously showing it. If alist has a non-nil inhibit-same-window entry, the selected window is not eligible for reuse. If alist contains a reusable-frames entry, its value determines which frames to search for a suitable window as with display-buffer-reuse-window.

If alist has a previous-window entry, the window specified by that entry will override any other window found by the methods above, even if that window never showed buffer before.

Function: display-buffer-at-bottom buffer alist

This function tries to display buffer in a window at the bottom of the selected frame.

This either splits the window at the bottom of the frame or the frame’s root window, or reuses an existing window at the bottom of the selected frame.

Function: display-buffer-use-some-window buffer alist

This function tries to display buffer by choosing an existing window and displaying the buffer in that window. It can fail if all windows are dedicated to another buffer (see section Dedicated Windows).

Function: display-buffer-no-window buffer alist

If alist has a non-nil allow-no-window entry, then this function does not display buffer. This allows to override the default action and avoid displaying the buffer. It is assumed that when the caller specifies a non-nil allow-no-window value it can handle a nil value returned from display-buffer in this case.

To illustrate the use of action functions, consider the following example.

(display-buffer
 (get-buffer-create "*foo*")
 '((display-buffer-reuse-window
    display-buffer-pop-up-window
    display-buffer-pop-up-frame)
   (reusable-frames . 0)
   (window-height . 10) (window-width . 40)))

Evaluating the form above will cause display-buffer to proceed as follows: If a buffer called *foo* already appears on a visible or iconified frame, it will reuse its window. Otherwise, it will try to pop up a new window or, if that is impossible, a new frame and show the buffer there. If all these steps fail, it will proceed using whatever display-buffer-base-action and display-buffer-fallback-action prescribe.

Furthermore, display-buffer will try to adjust a reused window (provided *foo* was put by display-buffer there before) or a popped-up window as follows: If the window is part of a vertical combination, it will set its height to ten lines. Note that if, instead of the number “10”, we specified the function fit-window-to-buffer, display-buffer would come up with a one-line window to fit the empty buffer. If the window is part of a horizontal combination, it sets its width to 40 columns. Whether a new window is vertically or horizontally combined depends on the shape of the window split and the values of split-window-preferred-function, split-height-threshold and split-width-threshold (see section Additional Options for Displaying Buffers).

Now suppose we combine this call with a preexisting setup for ‘display-buffer-alist’ as follows.

(let ((display-buffer-alist
       (cons
        '("\\*foo\\*"
          (display-buffer-reuse-window display-buffer-below-selected)
          (reusable-frames)
          (window-height . 5))
        display-buffer-alist)))
  (display-buffer
   (get-buffer-create "*foo*")
   '((display-buffer-reuse-window
      display-buffer-pop-up-window
      display-buffer-pop-up-frame)
     (reusable-frames . 0)
     (window-height . 10) (window-width . 40))))

This form will have display-buffer first try reusing a window that shows *foo* on the selected frame. If there’s no such window, it will try to split the selected window or, if that is impossible, use the window below the selected window.

If there’s no window below the selected one, or the window below the selected one is dedicated to its buffer, display-buffer will proceed as described in the previous example. Note, however, that when it tries to adjust the height of any reused or popped-up window, it will in any case try to set its number of lines to “5” since that value overrides the corresponding specification in the action argument of display-buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.14 Additional Options for Displaying Buffers

The behavior of the standard display actions of display-buffer (see section Choosing a Window for Display) can be modified by a variety of user options.

User Option: pop-up-windows

If the value of this variable is non-nil, display-buffer is allowed to split an existing window to make a new window for displaying in. This is the default.

This variable is provided mainly for backward compatibility. It is obeyed by display-buffer via a special mechanism in display-buffer-fallback-action, which only calls the action function display-buffer-pop-up-window (see section Action Functions for display-buffer) when the value is nil. It is not consulted by display-buffer-pop-up-window itself, which the user may specify directly in display-buffer-alist etc.

User Option: split-window-preferred-function

This variable specifies a function for splitting a window, in order to make a new window for displaying a buffer. It is used by the display-buffer-pop-up-window action function to actually split the window (see section Action Functions for display-buffer).

The default value is split-window-sensibly, which is documented below. The value must be a function that takes one argument, a window, and return either a new window (which will be used to display the desired buffer) or nil (which means the splitting failed).

Function: split-window-sensibly window

This function tries to split window, and return the newly created window. If window cannot be split, it returns nil.

This function obeys the usual rules that determine when a window may be split (see section Splitting Windows). It first tries to split by placing the new window below, subject to the restriction imposed by split-height-threshold (see below), in addition to any other restrictions. If that fails, it tries to split by placing the new window to the right, subject to split-width-threshold (see below). If that fails, and the window is the only window on its frame, this function again tries to split and place the new window below, disregarding split-height-threshold. If this fails as well, this function gives up and returns nil.

User Option: split-height-threshold

This variable, used by split-window-sensibly, specifies whether to split the window placing the new window below. If it is an integer, that means to split only if the original window has at least that many lines. If it is nil, that means not to split this way.

User Option: split-width-threshold

This variable, used by split-window-sensibly, specifies whether to split the window placing the new window to the right. If the value is an integer, that means to split only if the original window has at least that many columns. If the value is nil, that means not to split this way.

User Option: pop-up-frames

If the value of this variable is non-nil, that means display-buffer may display buffers by making new frames. The default is nil.

A non-nil value also means that when display-buffer is looking for a window already displaying buffer-or-name, it can search any visible or iconified frame, not just the selected frame.

This variable is provided mainly for backward compatibility. It is obeyed by display-buffer via a special mechanism in display-buffer-fallback-action, which calls the action function display-buffer-pop-up-frame (see section Action Functions for display-buffer) if the value is non-nil. (This is done before attempting to split a window.) This variable is not consulted by display-buffer-pop-up-frame itself, which the user may specify directly in display-buffer-alist etc.

User Option: pop-up-frame-function

This variable specifies a function for creating a new frame, in order to make a new window for displaying a buffer. It is used by the display-buffer-pop-up-frame action function (see section Action Functions for display-buffer).

The value should be a function that takes no arguments and returns a frame, or nil if no frame could be created. The default value is a function that creates a frame using the parameters specified by pop-up-frame-alist (see below).

User Option: pop-up-frame-alist

This variable holds an alist of frame parameters (see section Frame Parameters), which is used by the default function in pop-up-frame-function to make a new frame. The default is nil.

User Option: same-window-buffer-names

A list of buffer names for buffers that should be displayed in the selected window. If a buffer’s name is in this list, display-buffer handles the buffer by showing it in the selected window.

User Option: same-window-regexps

A list of regular expressions that specify buffers that should be displayed in the selected window. If the buffer’s name matches any of the regular expressions in this list, display-buffer handles the buffer by showing it in the selected window.

Function: same-window-p buffer-name

This function returns t if displaying a buffer named buffer-name with display-buffer would put it in the selected window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.15 Window History

Each window remembers in a list the buffers it has previously displayed, and the order in which these buffers were removed from it. This history is used, for example, by replace-buffer-in-windows (see section Buffers and Windows). The list is automatically maintained by Emacs, but you can use the following functions to explicitly inspect or alter it:

Function: window-prev-buffers &optional window

This function returns a list specifying the previous contents of window. The optional argument window should be a live window and defaults to the selected one.

Each list element has the form (buffer window-start window-pos), where buffer is a buffer previously shown in the window, window-start is the window start position (see section The Window Start and End Positions) when that buffer was last shown, and window-pos is the point position (see section Windows and Point) when that buffer was last shown in window.

The list is ordered so that earlier elements correspond to more recently-shown buffers, and the first element usually corresponds to the buffer most recently removed from the window.

Function: set-window-prev-buffers window prev-buffers

This function sets window’s previous buffers to the value of prev-buffers. The argument window must be a live window and defaults to the selected one. The argument prev-buffers should be a list of the same form as that returned by window-prev-buffers.

In addition, each buffer maintains a list of next buffers, which is a list of buffers re-shown by switch-to-prev-buffer (see below). This list is mainly used by switch-to-prev-buffer and switch-to-next-buffer for choosing buffers to switch to.

Function: window-next-buffers &optional window

This function returns the list of buffers recently re-shown in window via switch-to-prev-buffer. The window argument must denote a live window or nil (meaning the selected window).

Function: set-window-next-buffers window next-buffers

This function sets the next buffer list of window to next-buffers. The window argument should be a live window or nil (meaning the selected window). The argument next-buffers should be a list of buffers.

The following commands can be used to cycle through the global buffer list, much like bury-buffer and unbury-buffer. However, they cycle according to the specified window’s history list, rather than the global buffer list. In addition, they restore window-specific window start and point positions, and may show a buffer even if it is already shown in another window. The switch-to-prev-buffer command, in particular, is used by replace-buffer-in-windows, bury-buffer and quit-window to find a replacement buffer for a window.

Command: switch-to-prev-buffer &optional window bury-or-kill

This command displays the previous buffer in window. The argument window should be a live window or nil (meaning the selected window). If the optional argument bury-or-kill is non-nil, this means that the buffer currently shown in window is about to be buried or killed and consequently should not be switched to in future invocations of this command.

The previous buffer is usually the buffer shown before the buffer currently shown in window. However, a buffer that has been buried or killed, or has been already shown by a recent invocation of switch-to-prev-buffer, does not qualify as previous buffer.

If repeated invocations of this command have already shown all buffers previously shown in window, further invocations will show buffers from the buffer list of the frame window appears on (see section The Buffer List), trying to skip buffers that are already shown in another window on that frame.

Command: switch-to-next-buffer &optional window

This command switches to the next buffer in window, thus undoing the effect of the last switch-to-prev-buffer command in window. The argument window must be a live window and defaults to the selected one.

If there is no recent invocation of switch-to-prev-buffer that can be undone, this function tries to show a buffer from the buffer list of the frame window appears on (see section The Buffer List).

By default switch-to-prev-buffer and switch-to-next-buffer can switch to a buffer that is already shown in another window on the same frame. The following option can be used to override this behavior.

User Option: switch-to-visible-buffer

If this variable is non-nil, switch-to-prev-buffer and switch-to-next-buffer may switch to a buffer that is already visible on the same frame, provided the buffer was shown in the relevant window before. If it is nil, switch-to-prev-buffer and switch-to-next-buffer always try to avoid switching to a buffer that is already visible in another window on the same frame. The default is t.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.16 Dedicated Windows

Functions for displaying a buffer can be told to not use specific windows by marking these windows as dedicated to their buffers. display-buffer (see section Choosing a Window for Display) never uses a dedicated window for displaying another buffer in it. get-lru-window and get-largest-window (see section Cyclic Ordering of Windows) do not consider dedicated windows as candidates when their dedicated argument is non-nil. The behavior of set-window-buffer (see section Buffers and Windows) with respect to dedicated windows is slightly different, see below.

Functions supposed to remove a buffer from a window or a window from a frame can behave specially when a window they operate on is dedicated. We will distinguish three basic cases, namely where (1) the window is not the only window on its frame, (2) the window is the only window on its frame but there are other frames on the same terminal left, and (3) the window is the only window on the only frame on the same terminal.

In particular, delete-windows-on (see section Deleting Windows) handles case (2) by deleting the associated frame and case (3) by showing another buffer in that frame’s only window. The function replace-buffer-in-windows (see section Buffers and Windows) which is called when a buffer gets killed, deletes the window in case (1) and behaves like delete-windows-on otherwise.

When bury-buffer (see section The Buffer List) operates on the selected window (which shows the buffer that shall be buried), it handles case (2) by calling frame-auto-hide-function (see section Quitting Windows) to deal with the selected frame. The other two cases are handled as with replace-buffer-in-windows.

Function: window-dedicated-p &optional window

This function returns non-nil if window is dedicated to its buffer and nil otherwise. More precisely, the return value is the value assigned by the last call of set-window-dedicated-p for window, or nil if that function was never called with window as its argument. The default for window is the selected window.

Function: set-window-dedicated-p window flag

This function marks window as dedicated to its buffer if flag is non-nil, and non-dedicated otherwise.

As a special case, if flag is t, window becomes strongly dedicated to its buffer. set-window-buffer signals an error when the window it acts upon is strongly dedicated to its buffer and does not already display the buffer it is asked to display. Other functions do not treat t differently from any non-nil value.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.17 Quitting Windows

When you want to get rid of a window used for displaying a buffer, you can call delete-window or delete-windows-on (see section Deleting Windows) to remove that window from its frame. If the buffer is shown on a separate frame, you might want to call delete-frame (see section Deleting Frames) instead. If, on the other hand, a window has been reused for displaying the buffer, you might prefer showing the buffer previously shown in that window, by calling the function switch-to-prev-buffer (see section Window History). Finally, you might want to either bury (see section The Buffer List) or kill (see section Killing Buffers) the window’s buffer.

The following command uses information on how the window for displaying the buffer was obtained in the first place, thus attempting to automate the above decisions for you.

Command: quit-window &optional kill window

This command quits window and buries its buffer. The argument window must be a live window and defaults to the selected one. With prefix argument kill non-nil, it kills the buffer instead of burying it. It calls the function quit-restore-window described next to deal with the window and its buffer.

Function: quit-restore-window &optional window bury-or-kill

This function tries to restore the state of window that existed before its buffer was displayed in it. The optional argument window must be a live window and defaults to the selected one.

If window was created specially for displaying its buffer, this function deletes window provided its frame contains at least one other live window. If window is the only window on its frame and there are other frames on the frame’s terminal, the value of the optional argument bury-or-kill determines how to proceed with the window. If bury-or-kill equals kill, the frame is deleted unconditionally. Otherwise, the fate of the frame is determined by calling frame-auto-hide-function (see below) with that frame as sole argument.

Otherwise, this function tries to redisplay the buffer previously shown in window. It also tries to restore the window start (see section The Window Start and End Positions) and point (see section Windows and Point) positions of the previously shown buffer. If, in addition, window’s buffer was temporarily resized, this function will also try to restore the original height of window.

The cases described so far require that the buffer shown in window is still the buffer displayed by the last buffer display function for this window. If another buffer has been shown in the meantime, or the buffer previously shown no longer exists, this function calls switch-to-prev-buffer (see section Window History) to show some other buffer instead.

The optional argument bury-or-kill specifies how to deal with window’s buffer. The following values are handled:

nil

This means to not deal with the buffer in any particular way. As a consequence, if window is not deleted, invoking switch-to-prev-buffer will usually show the buffer again.

append

This means that if window is not deleted, its buffer is moved to the end of window’s list of previous buffers, so it’s less likely that a future invocation of switch-to-prev-buffer will switch to it. Also, it moves the buffer to the end of the frame’s buffer list.

bury

This means that if window is not deleted, its buffer is removed from window’s list of previous buffers. Also, it moves the buffer to the end of the frame’s buffer list. This value provides the most reliable remedy to not have switch-to-prev-buffer switch to this buffer again without killing the buffer.

kill

This means to kill window’s buffer.

quit-restore-window bases its decisions on information stored in window’s quit-restore window parameter (see section Window Parameters), and resets that parameter to nil after it’s done.

The following option specifies how to deal with a frame containing just one window that should be either quit, or whose buffer should be buried.

User Option: frame-auto-hide-function

The function specified by this option is called to automatically hide frames. This function is called with one argument—a frame.

The function specified here is called by bury-buffer (see section The Buffer List) when the selected window is dedicated and shows the buffer to bury. It is also called by quit-restore-window (see above) when the frame of the window to quit has been specially created for displaying that window’s buffer and the buffer is not killed.

The default is to call iconify-frame (see section Visibility of Frames). Alternatively, you may specify either delete-frame (see section Deleting Frames) to remove the frame from its display, ignore to leave the frame unchanged, or any other function that can take a frame as its sole argument.

Note that the function specified by this option is called only if the specified frame contains just one live window and there is at least one other frame on the same terminal.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.18 Windows and Point

Each window has its own value of point (see section Point), independent of the value of point in other windows displaying the same buffer. This makes it useful to have multiple windows showing one buffer.

As far as the user is concerned, point is where the cursor is, and when the user switches to another buffer, the cursor jumps to the position of point in that buffer.

Function: window-point &optional window

This function returns the current position of point in window. For a nonselected window, this is the value point would have (in that window’s buffer) if that window were selected. The default for window is the selected window.

When window is the selected window, the value returned is the value of point in that window’s buffer. Strictly speaking, it would be more correct to return the “top-level” value of point, outside of any save-excursion forms. But that value is hard to find.

Function: set-window-point window position

This function positions point in window at position position in window’s buffer. It returns position.

If window is selected, this simply does goto-char in window’s buffer.

Variable: window-point-insertion-type

This variable specifies the marker insertion type (see section Marker Insertion Types) of window-point. The default is nil, so window-point will stay behind text inserted there.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.19 The Window Start and End Positions

Each window maintains a marker used to keep track of a buffer position that specifies where in the buffer display should start. This position is called the display-start position of the window (or just the start). The character after this position is the one that appears at the upper left corner of the window. It is usually, but not inevitably, at the beginning of a text line.

After switching windows or buffers, and in some other cases, if the window start is in the middle of a line, Emacs adjusts the window start to the start of a line. This prevents certain operations from leaving the window start at a meaningless point within a line. This feature may interfere with testing some Lisp code by executing it using the commands of Lisp mode, because they trigger this readjustment. To test such code, put it into a command and bind the command to a key.

Function: window-start &optional window

This function returns the display-start position of window window. If window is nil, the selected window is used.

When you create a window, or display a different buffer in it, the display-start position is set to a display-start position recently used for the same buffer, or to point-min if the buffer doesn’t have any.

Redisplay updates the window-start position (if you have not specified it explicitly since the previous redisplay)—to make sure point appears on the screen. Nothing except redisplay automatically changes the window-start position; if you move point, do not expect the window-start position to change in response until after the next redisplay.

Function: window-end &optional window update

This function returns the position where display of its buffer ends in window. The default for window is the selected window.

Simply changing the buffer text or moving point does not update the value that window-end returns. The value is updated only when Emacs redisplays and redisplay completes without being preempted.

If the last redisplay of window was preempted, and did not finish, Emacs does not know the position of the end of display in that window. In that case, this function returns nil.

If update is non-nil, window-end always returns an up-to-date value for where display ends, based on the current window-start value. If a previously saved value of that position is still valid, window-end returns that value; otherwise it computes the correct value by scanning the buffer text.

Even if update is non-nil, window-end does not attempt to scroll the display if point has moved off the screen, the way real redisplay would do. It does not alter the window-start value. In effect, it reports where the displayed text will end if scrolling is not required.

Function: set-window-start window position &optional noforce

This function sets the display-start position of window to position in window’s buffer. It returns position.

The display routines insist that the position of point be visible when a buffer is displayed. Normally, they change the display-start position (that is, scroll the window) whenever necessary to make point visible. However, if you specify the start position with this function using nil for noforce, it means you want display to start at position even if that would put the location of point off the screen. If this does place point off screen, the display routines move point to the left margin on the middle line in the window.

For example, if point is 1 and you set the start of the window to 37, the start of the next line, point will be “above” the top of the window. The display routines will automatically move point if it is still 1 when redisplay occurs. Here is an example:

;; Here is what ‘foo’ looks like before executing
;;   the set-window-start expression.
---------- Buffer: foo ----------
∗This is the contents of buffer foo.
2
3
4
5
6
---------- Buffer: foo ----------
(set-window-start
 (selected-window)
 (save-excursion
   (goto-char 1)
   (forward-line 1)
   (point)))
⇒ 37
;; Here is what ‘foo’ looks like after executing
;;   the set-window-start expression.
---------- Buffer: foo ----------
2
3
∗4
5
6
---------- Buffer: foo ----------

If noforce is non-nil, and position would place point off screen at the next redisplay, then redisplay computes a new window-start position that works well with point, and thus position is not used.

Function: pos-visible-in-window-p &optional position window partially

This function returns non-nil if position is within the range of text currently visible on the screen in window. It returns nil if position is scrolled vertically out of view. Locations that are partially obscured are not considered visible unless partially is non-nil. The argument position defaults to the current position of point in window; window, to the selected window. If position is t, that means to check the last visible position in window.

This function considers only vertical scrolling. If position is out of view only because window has been scrolled horizontally, pos-visible-in-window-p returns non-nil anyway. See section Horizontal Scrolling.

If position is visible, pos-visible-in-window-p returns t if partially is nil; if partially is non-nil, and the character following position is fully visible, it returns a list of the form (x y), where x and y are the pixel coordinates relative to the top left corner of the window; otherwise it returns an extended list of the form (x y rtop rbot rowh vpos), where rtop and rbot specify the number of off-window pixels at the top and bottom of the row at position, rowh specifies the visible height of that row, and vpos specifies the vertical position (zero-based row number) of that row.

Here is an example:

;; If point is off the screen now, recenter it now.
(or (pos-visible-in-window-p
     (point) (selected-window))
    (recenter 0))
Function: window-line-height &optional line window

This function returns the height of text line line in window. If line is one of header-line or mode-line, window-line-height returns information about the corresponding line of the window. Otherwise, line is a text line number starting from 0. A negative number counts from the end of the window. The default for line is the current line in window; the default for window is the selected window.

If the display is not up to date, window-line-height returns nil. In that case, pos-visible-in-window-p may be used to obtain related information.

If there is no line corresponding to the specified line, window-line-height returns nil. Otherwise, it returns a list (height vpos ypos offbot), where height is the height in pixels of the visible part of the line, vpos and ypos are the vertical position in lines and pixels of the line relative to the top of the first text line, and offbot is the number of off-window pixels at the bottom of the text line. If there are off-window pixels at the top of the (first) text line, ypos is negative.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.20 Textual Scrolling

Textual scrolling means moving the text up or down through a window. It works by changing the window’s display-start location. It may also change the value of window-point to keep point on the screen (see section Windows and Point).

The basic textual scrolling functions are scroll-up (which scrolls forward) and scroll-down (which scrolls backward). In these function names, “up” and “down” refer to the direction of motion of the buffer text relative to the window. Imagine that the text is written on a long roll of paper and that the scrolling commands move the paper up and down. Thus, if you are looking at the middle of a buffer and repeatedly call scroll-down, you will eventually see the beginning of the buffer.

Unfortunately, this sometimes causes confusion, because some people tend to think in terms of the opposite convention: they imagine the window moving over text that remains in place, so that “down” commands take you to the end of the buffer. This convention is consistent with fact that such a command is bound to a key named PageDown on modern keyboards.

Textual scrolling functions (aside from scroll-other-window) have unpredictable results if the current buffer is not the one displayed in the selected window. See section The Current Buffer.

If the window contains a row taller than the height of the window (for example in the presence of a large image), the scroll functions will adjust the window’s vertical scroll position to scroll the partially visible row. Lisp callers can disable this feature by binding the variable auto-window-vscroll to nil (see section Vertical Fractional Scrolling).

Command: scroll-up &optional count

This function scrolls forward by count lines in the selected window.

If count is negative, it scrolls backward instead. If count is nil (or omitted), the distance scrolled is next-screen-context-lines lines less than the height of the window’s text area.

If the selected window cannot be scrolled any further, this function signals an error. Otherwise, it returns nil.

Command: scroll-down &optional count

This function scrolls backward by count lines in the selected window.

If count is negative, it scrolls forward instead. In other respects, it behaves the same way as scroll-up does.

Command: scroll-up-command &optional count

This behaves like scroll-up, except that if the selected window cannot be scrolled any further and the value of the variable scroll-error-top-bottom is t, it tries to move to the end of the buffer instead. If point is already there, it signals an error.

Command: scroll-down-command &optional count

This behaves like scroll-down, except that if the selected window cannot be scrolled any further and the value of the variable scroll-error-top-bottom is t, it tries to move to the beginning of the buffer instead. If point is already there, it signals an error.

Command: scroll-other-window &optional count

This function scrolls the text in another window upward count lines. Negative values of count, or nil, are handled as in scroll-up.

You can specify which buffer to scroll by setting the variable other-window-scroll-buffer to a buffer. If that buffer isn’t already displayed, scroll-other-window displays it in some window.

When the selected window is the minibuffer, the next window is normally the leftmost one immediately above it. You can specify a different window to scroll, when the minibuffer is selected, by setting the variable minibuffer-scroll-window. This variable has no effect when any other window is selected. When it is non-nil and the minibuffer is selected, it takes precedence over other-window-scroll-buffer. See Definition of minibuffer-scroll-window.

When the minibuffer is active, it is the next window if the selected window is the one at the bottom right corner. In this case, scroll-other-window attempts to scroll the minibuffer. If the minibuffer contains just one line, it has nowhere to scroll to, so the line reappears after the echo area momentarily displays the message ‘End of buffer’.

Variable: other-window-scroll-buffer

If this variable is non-nil, it tells scroll-other-window which buffer’s window to scroll.

User Option: scroll-margin

This option specifies the size of the scroll margin—a minimum number of lines between point and the top or bottom of a window. Whenever point gets within this many lines of the top or bottom of the window, redisplay scrolls the text automatically (if possible) to move point out of the margin, closer to the center of the window.

User Option: scroll-conservatively

This variable controls how scrolling is done automatically when point moves off the screen (or into the scroll margin). If the value is a positive integer n, then redisplay scrolls the text up to n lines in either direction, if that will bring point back into proper view. This behavior is called conservative scrolling. Otherwise, scrolling happens in the usual way, under the control of other variables such as scroll-up-aggressively and scroll-down-aggressively.

The default value is zero, which means that conservative scrolling never happens.

User Option: scroll-down-aggressively

The value of this variable should be either nil or a fraction f between 0 and 1. If it is a fraction, that specifies where on the screen to put point when scrolling down. More precisely, when a window scrolls down because point is above the window start, the new start position is chosen to put point f part of the window height from the top. The larger f, the more aggressive the scrolling.

A value of nil is equivalent to .5, since its effect is to center point. This variable automatically becomes buffer-local when set in any fashion.

User Option: scroll-up-aggressively

Likewise, for scrolling up. The value, f, specifies how far point should be placed from the bottom of the window; thus, as with scroll-up-aggressively, a larger value scrolls more aggressively.

User Option: scroll-step

This variable is an older variant of scroll-conservatively. The difference is that if its value is n, that permits scrolling only by precisely n lines, not a smaller number. This feature does not work with scroll-margin. The default value is zero.

User Option: scroll-preserve-screen-position

If this option is t, whenever a scrolling command moves point off-window, Emacs tries to adjust point to keep the cursor at its old vertical position in the window, rather than the window edge.

If the value is non-nil and not t, Emacs adjusts point to keep the cursor at the same vertical position, even if the scrolling command didn’t move point off-window.

This option affects all scroll commands that have a non-nil scroll-command symbol property.

User Option: next-screen-context-lines

The value of this variable is the number of lines of continuity to retain when scrolling by full screens. For example, scroll-up with an argument of nil scrolls so that this many lines at the bottom of the window appear instead at the top. The default value is 2.

User Option: scroll-error-top-bottom

If this option is nil (the default), scroll-up-command and scroll-down-command simply signal an error when no more scrolling is possible.

If the value is t, these commands instead move point to the beginning or end of the buffer (depending on scrolling direction); only if point is already on that position do they signal an error.

Command: recenter &optional count

This function scrolls the text in the selected window so that point is displayed at a specified vertical position within the window. It does not “move point” with respect to the text.

If count is a non-negative number, that puts the line containing point count lines down from the top of the window. If count is a negative number, then it counts upward from the bottom of the window, so that -1 stands for the last usable line in the window.

If count is nil (or a non-nil list), recenter puts the line containing point in the middle of the window. If count is nil, this function may redraw the frame, according to the value of recenter-redisplay.

When recenter is called interactively, count is the raw prefix argument. Thus, typing C-u as the prefix sets the count to a non-nil list, while typing C-u 4 sets count to 4, which positions the current line four lines from the top.

With an argument of zero, recenter positions the current line at the top of the window. The command recenter-top-bottom offers a more convenient way to achieve this.

User Option: recenter-redisplay

If this variable is non-nil, calling recenter with a nil argument redraws the frame. The default value is tty, which means only redraw the frame if it is a tty frame.

Command: recenter-top-bottom &optional count

This command, which is the default binding for C-l, acts like recenter, except if called with no argument. In that case, successive calls place point according to the cycling order defined by the variable recenter-positions.

User Option: recenter-positions

This variable controls how recenter-top-bottom behaves when called with no argument. The default value is (middle top bottom), which means that successive calls of recenter-top-bottom with no argument cycle between placing point at the middle, top, and bottom of the window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.21 Vertical Fractional Scrolling

Vertical fractional scrolling means shifting text in a window up or down by a specified multiple or fraction of a line. Each window has a vertical scroll position, which is a number, never less than zero. It specifies how far to raise the contents of the window. Raising the window contents generally makes all or part of some lines disappear off the top, and all or part of some other lines appear at the bottom. The usual value is zero.

The vertical scroll position is measured in units of the normal line height, which is the height of the default font. Thus, if the value is .5, that means the window contents are scrolled up half the normal line height. If it is 3.3, that means the window contents are scrolled up somewhat over three times the normal line height.

What fraction of a line the vertical scrolling covers, or how many lines, depends on what the lines contain. A value of .5 could scroll a line whose height is very short off the screen, while a value of 3.3 could scroll just part of the way through a tall line or an image.

Function: window-vscroll &optional window pixels-p

This function returns the current vertical scroll position of window. The default for window is the selected window. If pixels-p is non-nil, the return value is measured in pixels, rather than in units of the normal line height.

(window-vscroll)
     ⇒ 0
Function: set-window-vscroll window lines &optional pixels-p

This function sets window’s vertical scroll position to lines. If window is nil, the selected window is used. The argument lines should be zero or positive; if not, it is taken as zero.

The actual vertical scroll position must always correspond to an integral number of pixels, so the value you specify is rounded accordingly.

The return value is the result of this rounding.

(set-window-vscroll (selected-window) 1.2)
     ⇒ 1.13

If pixels-p is non-nil, lines specifies a number of pixels. In this case, the return value is lines.

Variable: auto-window-vscroll

If this variable is non-nil, the line-move, scroll-up, and scroll-down functions will automatically modify the vertical scroll position to scroll through display rows that are taller than the height of the window, for example in the presence of large images.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.22 Horizontal Scrolling

Horizontal scrolling means shifting the image in the window left or right by a specified multiple of the normal character width. Each window has a horizontal scroll position, which is a number, never less than zero. It specifies how far to shift the contents left. Shifting the window contents left generally makes all or part of some characters disappear off the left, and all or part of some other characters appear at the right. The usual value is zero.

The horizontal scroll position is measured in units of the normal character width, which is the width of space in the default font. Thus, if the value is 5, that means the window contents are scrolled left by 5 times the normal character width. How many characters actually disappear off to the left depends on their width, and could vary from line to line.

Because we read from side to side in the “inner loop”, and from top to bottom in the “outer loop”, the effect of horizontal scrolling is not like that of textual or vertical scrolling. Textual scrolling involves selection of a portion of text to display, and vertical scrolling moves the window contents contiguously; but horizontal scrolling causes part of each line to go off screen.

Usually, no horizontal scrolling is in effect; then the leftmost column is at the left edge of the window. In this state, scrolling to the right is meaningless, since there is no data to the left of the edge to be revealed by it; so this is not allowed. Scrolling to the left is allowed; it scrolls the first columns of text off the edge of the window and can reveal additional columns on the right that were truncated before. Once a window has a nonzero amount of leftward horizontal scrolling, you can scroll it back to the right, but only so far as to reduce the net horizontal scroll to zero. There is no limit to how far left you can scroll, but eventually all the text will disappear off the left edge.

If auto-hscroll-mode is set, redisplay automatically alters the horizontal scrolling of a window as necessary to ensure that point is always visible. However, you can still set the horizontal scrolling value explicitly. The value you specify serves as a lower bound for automatic scrolling, i.e., automatic scrolling will not scroll a window to a column less than the specified one.

Command: scroll-left &optional count set-minimum

This function scrolls the selected window count columns to the left (or to the right if count is negative). The default for count is the window width, minus 2.

The return value is the total amount of leftward horizontal scrolling in effect after the change—just like the value returned by window-hscroll (below).

Once you scroll a window as far right as it can go, back to its normal position where the total leftward scrolling is zero, attempts to scroll any farther right have no effect.

If set-minimum is non-nil, the new scroll amount becomes the lower bound for automatic scrolling; that is, automatic scrolling will not scroll a window to a column less than the value returned by this function. Interactive calls pass non-nil for set-minimum.

Command: scroll-right &optional count set-minimum

This function scrolls the selected window count columns to the right (or to the left if count is negative). The default for count is the window width, minus 2. Aside from the direction of scrolling, this works just like scroll-left.

Function: window-hscroll &optional window

This function returns the total leftward horizontal scrolling of window—the number of columns by which the text in window is scrolled left past the left margin. The default for window is the selected window.

The return value is never negative. It is zero when no horizontal scrolling has been done in window (which is usually the case).

(window-hscroll)
     ⇒ 0
(scroll-left 5)
     ⇒ 5
(window-hscroll)
     ⇒ 5
Function: set-window-hscroll window columns

This function sets horizontal scrolling of window. The value of columns specifies the amount of scrolling, in terms of columns from the left margin. The argument columns should be zero or positive; if not, it is taken as zero. Fractional values of columns are not supported at present.

Note that set-window-hscroll may appear not to work if you test it by evaluating a call with M-: in a simple way. What happens is that the function sets the horizontal scroll value and returns, but then redisplay adjusts the horizontal scrolling to make point visible, and this overrides what the function did. You can observe the function’s effect if you call it while point is sufficiently far from the left margin that it will remain visible.

The value returned is columns.

(set-window-hscroll (selected-window) 10)
     ⇒ 10

Here is how you can determine whether a given position position is off the screen due to horizontal scrolling:

(defun hscroll-on-screen (window position)
  (save-excursion
    (goto-char position)
    (and
     (>= (- (current-column) (window-hscroll window)) 0)
     (< (- (current-column) (window-hscroll window))
        (window-width window)))))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.23 Coordinates and Windows

This section describes functions that report the position of a window. Most of these functions report positions relative to the window’s frame. In this case, the coordinate origin ‘(0,0)’ lies near the upper left corner of the frame. For technical reasons, on graphical displays the origin is not located at the exact corner of the graphical window as it appears on the screen. If Emacs is built with the GTK+ toolkit, the origin is at the upper left corner of the frame area used for displaying Emacs windows, below the title-bar, GTK+ menu bar, and tool bar (since these are drawn by the window manager and/or GTK+, not by Emacs). But if Emacs is not built with GTK+, the origin is at the upper left corner of the tool bar (since in this case Emacs itself draws the tool bar). In both cases, the X and Y coordinates increase rightward and downward respectively.

Except where noted, X and Y coordinates are reported in integer character units, i.e., numbers of lines and columns respectively. On a graphical display, each “line” and “column” corresponds to the height and width of a default character specified by the frame’s default font.

Function: window-edges &optional window

This function returns a list of the edge coordinates of window. If window is omitted or nil, it defaults to the selected window.

The return value has the form (left top right bottom). These list elements are, respectively, the X coordinate of the leftmost column occupied by the window, the Y coordinate of the topmost row, the X coordinate one column to the right of the rightmost column, and the Y coordinate one row down from the bottommost row.

Note that these are the actual outer edges of the window, including any header line, mode line, scroll bar, fringes, window divider and display margins. On a text terminal, if the window has a neighbor on its right, its right edge includes the separator line between the window and its neighbor.

Function: window-inside-edges &optional window

This function is similar to window-edges, but the returned edge values are for the text area of the window. They exclude any header line, mode line, scroll bar, fringes, window divider, display margins, and vertical separator.

Function: window-top-line &optional window

This function returns the Y coordinate of the topmost row of window, equivalent to the top entry in the list returned by window-edges.

Function: window-left-column &optional window

This function returns the X coordinate of the leftmost column of window, equivalent to the left entry in the list returned by window-edges.

The following functions can be used to relate a set of frame-relative coordinates to a window:

Function: window-at x y &optional frame

This function returns the live window at the frame-relative coordinates x and y, on frame frame. If there is no window at that position, the return value is nil. If frame is omitted or nil, it defaults to the selected frame.

Function: coordinates-in-window-p coordinates window

This function checks whether a window window occupies the frame-relative coordinates coordinates, and if so, which part of the window that is. window should be a live window. coordinates should be a cons cell of the form (x . y), where x and y are frame-relative coordinates.

If there is no window at the specified position, the return value is nil . Otherwise, the return value is one of the following:

(relx . rely)

The coordinates are inside window. The numbers relx and rely are the equivalent window-relative coordinates for the specified position, counting from 0 at the top left corner of the window.

mode-line

The coordinates are in the mode line of window.

header-line

The coordinates are in the header line of window.

right-divider

The coordinates are in the divider separating window from a window on the right.

right-divider

The coordinates are in the divider separating window from a window beneath.

vertical-line

The coordinates are in the vertical line between window and its neighbor to the right. This value occurs only if the window doesn’t have a scroll bar; positions in a scroll bar are considered outside the window for these purposes.

left-fringe
right-fringe

The coordinates are in the left or right fringe of the window.

left-margin
right-margin

The coordinates are in the left or right margin of the window.

nil

The coordinates are not in any part of window.

The function coordinates-in-window-p does not require a frame as argument because it always uses the frame that window is on.

The following functions return window positions in pixels, rather than character units. Though mostly useful on graphical displays, they can also be called on text terminals, where the screen area of each text character is taken to be “one pixel”.

Function: window-pixel-edges &optional window

This function returns a list of pixel coordinates for the edges of window. If window is omitted or nil, it defaults to the selected window.

The return value has the form (left top right bottom). The list elements are, respectively, the X pixel coordinate of the left window edge, the Y pixel coordinate of the top edge, one more than the X pixel coordinate of the right edge, and one more than the Y pixel coordinate of the bottom edge.

Function: window-inside-pixel-edges &optional window

This function is like window-pixel-edges, except that it returns the pixel coordinates for the edges of the window’s text area, rather than the pixel coordinates for the edges of the window itself. window must specify a live window.

The following functions return window positions in pixels, relative to the display screen rather than the frame:

Function: window-absolute-pixel-edges &optional window

This function is like window-pixel-edges, except that it returns the edge pixel coordinates relative to the top left corner of the display screen.

Function: window-inside-absolute-pixel-edges &optional window

This function is like window-inside-pixel-edges, except that it returns the edge pixel coordinates relative to the top left corner of the display screen. window must specify a live window.

Function: window-pixel-left &optional window

This function returns the left pixel edge of window window. window must be a valid window and defaults to the selected one.

Function: window-pixel-top &optional window

This function returns the top pixel edge of window window. window must be a valid window and defaults to the selected one.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.24 Window Configurations

A window configuration records the entire layout of one frame—all windows, their sizes, which buffers they contain, how those buffers are scrolled, and their values of point and the mark; also their fringes, margins, and scroll bar settings. It also includes the value of minibuffer-scroll-window. As a special exception, the window configuration does not record the value of point in the selected window for the current buffer.

You can bring back an entire frame layout by restoring a previously saved window configuration. If you want to record the layout of all frames instead of just one, use a frame configuration instead of a window configuration. See section Frame Configurations.

Function: current-window-configuration &optional frame

This function returns a new object representing frame’s current window configuration. The default for frame is the selected frame. The variable window-persistent-parameters specifies which window parameters (if any) are saved by this function. See section Window Parameters.

Function: set-window-configuration configuration

This function restores the configuration of windows and buffers as specified by configuration, for the frame that configuration was created for.

The argument configuration must be a value that was previously returned by current-window-configuration. The configuration is restored in the frame from which configuration was made, whether that frame is selected or not. This always counts as a window size change and triggers execution of the window-size-change-functions (see section Hooks for Window Scrolling and Changes), because set-window-configuration doesn’t know how to tell whether the new configuration actually differs from the old one.

If the frame from which configuration was saved is dead, all this function does is restore the three variables window-min-height, window-min-width and minibuffer-scroll-window. In this case, the function returns nil. Otherwise, it returns t.

Here is a way of using this function to get the same effect as save-window-excursion:

(let ((config (current-window-configuration)))
  (unwind-protect
      (progn (split-window-below nil)
             …)
    (set-window-configuration config)))
Macro: save-window-excursion forms…

This macro records the window configuration of the selected frame, executes forms in sequence, then restores the earlier window configuration. The return value is the value of the final form in forms.

Most Lisp code should not use this macro; save-selected-window is typically sufficient. In particular, this macro cannot reliably prevent the code in forms from opening new windows, because new windows might be opened in other frames (see section Choosing a Window for Display), and save-window-excursion only saves and restores the window configuration on the current frame.

Do not use this macro in window-size-change-functions; exiting the macro triggers execution of window-size-change-functions, leading to an endless loop.

Function: window-configuration-p object

This function returns t if object is a window configuration.

Function: compare-window-configurations config1 config2

This function compares two window configurations as regards the structure of windows, but ignores the values of point and mark and the saved scrolling positions—it can return t even if those aspects differ.

The function equal can also compare two window configurations; it regards configurations as unequal if they differ in any respect, even a saved point or mark.

Function: window-configuration-frame config

This function returns the frame for which the window configuration config was made.

Other primitives to look inside of window configurations would make sense, but are not implemented because we did not need them. See the file winner.el for some more operations on windows configurations.

The objects returned by current-window-configuration die together with the Emacs process. In order to store a window configuration on disk and read it back in another Emacs session, you can use the functions described next. These functions are also useful to clone the state of a frame into an arbitrary live window (set-window-configuration effectively clones the windows of a frame into the root window of that very frame only).

Function: window-state-get &optional window writable

This function returns the state of window as a Lisp object. The argument window must be a valid window and defaults to the root window of the selected frame.

If the optional argument writable is non-nil, this means to not use markers for sampling positions like window-point or window-start. This argument should be non-nil when the state will be written to disk and read back in another session.

Together, the argument writable and the variable window-persistent-parameters specify which window parameters are saved by this function. See section Window Parameters.

The value returned by window-state-get can be used in the same session to make a clone of a window in another window. It can be also written to disk and read back in another session. In either case, use the following function to restore the state of the window.

Function: window-state-put state &optional window ignore

This function puts the window state state into window. The argument state should be the state of a window returned by an earlier invocation of window-state-get, see above. The optional argument window can be either a live window or an internal window (see section Windows and Frames) and defaults to the selected one. If window is not live, it is replaced by a live window before putting state into it.

If the optional argument ignore is non-nil, it means to ignore minimum window sizes and fixed-size restrictions. If ignore is safe, this means windows can get as small as one line and/or two columns.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.25 Window Parameters

This section describes how window parameters can be used to associate additional information with windows.

Function: window-parameter window parameter

This function returns window’s value for parameter. The default for window is the selected window. If window has no setting for parameter, this function returns nil.

Function: window-parameters &optional window

This function returns all parameters of window and their values. The default for window is the selected window. The return value is either nil, or an association list whose elements have the form (parameter . value).

Function: set-window-parameter window parameter value

This function sets window’s value of parameter to value and returns value. The default for window is the selected window.

By default, the functions that save and restore window configurations or the states of windows (see section Window Configurations) do not care about window parameters. This means that when you change the value of a parameter within the body of a save-window-excursion, the previous value is not restored when that macro exits. It also means that when you restore via window-state-put a window state saved earlier by window-state-get, all cloned windows have their parameters reset to nil. The following variable allows you to override the standard behavior:

Variable: window-persistent-parameters

This variable is an alist specifying which parameters get saved by current-window-configuration and window-state-get, and subsequently restored by set-window-configuration and window-state-put. See section Window Configurations.

The CAR of each entry of this alist is a symbol specifying the parameter. The CDR should be one of the following:

nil

This value means the parameter is saved neither by window-state-get nor by current-window-configuration.

t

This value specifies that the parameter is saved by current-window-configuration and (provided its writable argument is nil) by window-state-get.

writable

This means that the parameter is saved unconditionally by both current-window-configuration and window-state-get. This value should not be used for parameters whose values do not have a read syntax. Otherwise, invoking window-state-put in another session may fail with an invalid-read-syntax error.

Some functions (notably delete-window, delete-other-windows and split-window), may behave specially when their window argument has a parameter set. You can override such special behavior by binding the following variable to a non-nil value:

Variable: ignore-window-parameters

If this variable is non-nil, some standard functions do not process window parameters. The functions currently affected by this are split-window, delete-window, delete-other-windows, and other-window.

An application can bind this variable to a non-nil value around calls to these functions. If it does so, the application is fully responsible for correctly assigning the parameters of all involved windows when exiting that function.

The following parameters are currently used by the window management code:

delete-window

This parameter affects the execution of delete-window (see section Deleting Windows).

delete-other-windows

This parameter affects the execution of delete-other-windows (see section Deleting Windows).

split-window

This parameter affects the execution of split-window (see section Splitting Windows).

other-window

This parameter affects the execution of other-window (see section Cyclic Ordering of Windows).

no-other-window

This parameter marks the window as not selectable by other-window (see section Cyclic Ordering of Windows).

clone-of

This parameter specifies the window that this one has been cloned from. It is installed by window-state-get (see section Window Configurations).

quit-restore

This parameter is installed by the buffer display functions (see section Choosing a Window for Display) and consulted by quit-restore-window (see section Quitting Windows). It contains four elements:

The first element is one of the symbols window, meaning that the window has been specially created by display-buffer; frame, a separate frame has been created; same, the window has displayed the same buffer before; or other, the window showed another buffer before.

The second element is either one of the symbols window or frame, or a list whose elements are the buffer shown in the window before, that buffer’s window start and window point positions, and the window’s height at that time.

The third element is the window selected at the time the parameter was created. The function quit-restore-window tries to reselect that window when it deletes the window passed to it as argument.

The fourth element is the buffer whose display caused the creation of this parameter. quit-restore-window deletes the specified window only if it still shows that buffer.

There are additional parameters window-atom and window-side; these are reserved and should not be used by applications.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.26 Hooks for Window Scrolling and Changes

This section describes how a Lisp program can take action whenever a window displays a different part of its buffer or a different buffer. There are three actions that can change this: scrolling the window, switching buffers in the window, and changing the size of the window. The first two actions run window-scroll-functions; the last runs window-size-change-functions.

Variable: window-scroll-functions

This variable holds a list of functions that Emacs should call before redisplaying a window with scrolling. Displaying a different buffer in the window also runs these functions.

This variable is not a normal hook, because each function is called with two arguments: the window, and its new display-start position.

These functions must take care when using window-end (see section The Window Start and End Positions); if you need an up-to-date value, you must use the update argument to ensure you get it.

Warning: don’t use this feature to alter the way the window is scrolled. It’s not designed for that, and such use probably won’t work.

Variable: window-size-change-functions

This variable holds a list of functions to be called if the size of any window changes for any reason. The functions are called just once per redisplay, and just once for each frame on which size changes have occurred.

Each function receives the frame as its sole argument. There is no direct way to find out which windows on that frame have changed size, or precisely how. However, if a size-change function records, at each call, the existing windows and their sizes, it can also compare the present sizes and the previous sizes.

Creating or deleting windows counts as a size change, and therefore causes these functions to be called. Changing the frame size also counts, because it changes the sizes of the existing windows.

You may use save-selected-window in these functions (see section Selecting Windows). However, do not use save-window-excursion (see section Window Configurations); exiting that macro counts as a size change, which would cause these functions to be called over and over.

Variable: window-configuration-change-hook

A normal hook that is run every time you change the window configuration of an existing frame. This includes splitting or deleting windows, changing the sizes of windows, or displaying a different buffer in a window.

The buffer-local part of this hook is run once for each window on the affected frame, with the relevant window selected and its buffer current. The global part is run once for the modified frame, with that frame selected.

In addition, you can use jit-lock-register to register a Font Lock fontification function, which will be called whenever parts of a buffer are (re)fontified because a window was scrolled or its size changed. See section Other Font Lock Variables.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28 Frames

A frame is a screen object that contains one or more Emacs windows (see section Windows). It is the kind of object called a “window” in the terminology of graphical environments; but we can’t call it a “window” here, because Emacs uses that word in a different way. In Emacs Lisp, a frame object is a Lisp object that represents a frame on the screen. See section Frame Type.

A frame initially contains a single main window and/or a minibuffer window; you can subdivide the main window vertically or horizontally into smaller windows. See section Splitting Windows.

A terminal is a display device capable of displaying one or more Emacs frames. In Emacs Lisp, a terminal object is a Lisp object that represents a terminal. See section Terminal Type.

There are two classes of terminals: text terminals and graphical terminals. Text terminals are non-graphics-capable displays, including xterm and other terminal emulators. On a text terminal, each Emacs frame occupies the terminal’s entire screen; although you can create additional frames and switch between them, the terminal only shows one frame at a time. Graphical terminals, on the other hand, are managed by graphical display systems such as the X Window System, which allow Emacs to show multiple frames simultaneously on the same display.

On GNU and Unix systems, you can create additional frames on any available terminal, within a single Emacs session, regardless of whether Emacs was started on a text or graphical terminal. Emacs can display on both graphical and text terminals simultaneously. This comes in handy, for instance, when you connect to the same session from several remote locations. See section Multiple Terminals.

Function: framep object

This predicate returns a non-nil value if object is a frame, and nil otherwise. For a frame, the value indicates which kind of display the frame uses:

t

The frame is displayed on a text terminal.

x

The frame is displayed on an X graphical terminal.

w32

The frame is displayed on a MS-Windows graphical terminal.

ns

The frame is displayed on a GNUstep or Macintosh Cocoa graphical terminal.

pc

The frame is displayed on an MS-DOS terminal.

Function: frame-terminal &optional frame

This function returns the terminal object that displays frame. If frame is nil or unspecified, it defaults to the selected frame.

Function: terminal-live-p object

This predicate returns a non-nil value if object is a terminal that is live (i.e., not deleted), and nil otherwise. For live terminals, the return value indicates what kind of frames are displayed on that terminal; the list of possible values is the same as for framep above.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.1 Creating Frames

To create a new frame, call the function make-frame.

Command: make-frame &optional alist

This function creates and returns a new frame, displaying the current buffer.

The alist argument is an alist that specifies frame parameters for the new frame. See section Frame Parameters. If you specify the terminal parameter in alist, the new frame is created on that terminal. Otherwise, if you specify the window-system frame parameter in alist, that determines whether the frame should be displayed on a text terminal or a graphical terminal. See section Window Systems. If neither is specified, the new frame is created in the same terminal as the selected frame.

Any parameters not mentioned in alist default to the values in the alist default-frame-alist (see section Initial Frame Parameters); parameters not specified there default from the X resources or its equivalent on your operating system (see X Resources in The GNU Emacs Manual). After the frame is created, Emacs applies any parameters listed in frame-inherited-parameters (see below) and not present in the argument, taking the values from the frame that was selected when make-frame was called.

Note that on multi-monitor displays (see section Multiple Terminals), the window manager might position the frame differently than specified by the positional parameters in alist (see section Position Parameters). For example, some window managers have a policy of displaying the frame on the monitor that contains the largest part of the window (a.k.a. the dominating monitor).

This function itself does not make the new frame the selected frame. See section Input Focus. The previously selected frame remains selected. On graphical terminals, however, the windowing system may select the new frame for its own reasons.

Variable: before-make-frame-hook

A normal hook run by make-frame before it creates the frame.

Variable: after-make-frame-functions

An abnormal hook run by make-frame after it creates the frame. Each function in after-make-frame-functions receives one argument, the frame just created.

Variable: frame-inherited-parameters

This variable specifies the list of frame parameters that a newly created frame inherits from the currently selected frame. For each parameter (a symbol) that is an element in the list and is not present in the argument to make-frame, the function sets the value of that parameter in the created frame to its value in the selected frame.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.2 Multiple Terminals

Emacs represents each terminal as a terminal object data type (see section Terminal Type). On GNU and Unix systems, Emacs can use multiple terminals simultaneously in each session. On other systems, it can only use a single terminal. Each terminal object has the following attributes:

There is no primitive for creating terminal objects. Emacs creates them as needed, such as when you call make-frame-on-display (described below).

Function: terminal-name &optional terminal

This function returns the file name of the device used by terminal. If terminal is omitted or nil, it defaults to the selected frame’s terminal. terminal can also be a frame, meaning that frame’s terminal.

Function: terminal-list

This function returns a list of all live terminal objects.

Function: get-device-terminal device

This function returns a terminal whose device name is given by device. If device is a string, it can be either the file name of a terminal device, or the name of an X display of the form ‘host:server.screen’. If device is a frame, this function returns that frame’s terminal; nil means the selected frame. Finally, if device is a terminal object that represents a live terminal, that terminal is returned. The function signals an error if its argument is none of the above.

Function: delete-terminal &optional terminal force

This function deletes all frames on terminal and frees the resources used by it. It runs the abnormal hook delete-terminal-functions, passing terminal as the argument to each function.

If terminal is omitted or nil, it defaults to the selected frame’s terminal. terminal can also be a frame, meaning that frame’s terminal.

Normally, this function signals an error if you attempt to delete the sole active terminal, but if force is non-nil, you are allowed to do so. Emacs automatically calls this function when the last frame on a terminal is deleted (see section Deleting Frames).

Variable: delete-terminal-functions

An abnormal hook run by delete-terminal. Each function receives one argument, the terminal argument passed to delete-terminal. Due to technical details, the functions may be called either just before the terminal is deleted, or just afterwards.

A few Lisp variables are terminal-local; that is, they have a separate binding for each terminal. The binding in effect at any time is the one for the terminal that the currently selected frame belongs to. These variables include default-minibuffer-frame, defining-kbd-macro, last-kbd-macro, and system-key-alist. They are always terminal-local, and can never be buffer-local (see section Buffer-Local Variables).

On GNU and Unix systems, each X display is a separate graphical terminal. When Emacs is started from within the X window system, it uses the X display specified by the DISPLAY environment variable, or by the ‘--display’ option (see Initial Options in The GNU Emacs Manual). Emacs can connect to other X displays via the command make-frame-on-display. Each X display has its own selected frame and its own minibuffer windows; however, only one of those frames is “the selected frame” at any given moment (see section Input Focus). Emacs can even connect to other text terminals, by interacting with the emacsclient program. See Emacs Server in The GNU Emacs Manual.

A single X server can handle more than one display. Each X display has a three-part name, ‘hostname:displaynumber.screennumber’. The first part, hostname, specifies the name of the machine to which the display is physically connected. The second part, displaynumber, is a zero-based number that identifies one or more monitors connected to that machine that share a common keyboard and pointing device (mouse, tablet, etc.). The third part, screennumber, identifies a zero-based screen number (a separate monitor) that is part of a single monitor collection on that X server. When you use two or more screens belonging to one server, Emacs knows by the similarity in their names that they share a single keyboard.

Systems that don’t use the X window system, such as MS-Windows, don’t support the notion of X displays, and have only one display on each host. The display name on these systems doesn’t follow the above 3-part format; for example, the display name on MS-Windows systems is a constant string ‘w32’, and exists for compatibility, so that you could pass it to functions that expect a display name.

Command: make-frame-on-display display &optional parameters

This function creates and returns a new frame on display, taking the other frame parameters from the alist parameters. display should be the name of an X display (a string).

Before creating the frame, this function ensures that Emacs is “set up” to display graphics. For instance, if Emacs has not processed X resources (e.g., if it was started on a text terminal), it does so at this time. In all other respects, this function behaves like make-frame (see section Creating Frames).

Function: x-display-list

This function returns a list that indicates which X displays Emacs has a connection to. The elements of the list are strings, and each one is a display name.

Function: x-open-connection display &optional xrm-string must-succeed

This function opens a connection to the X display display, without creating a frame on that display. Normally, Emacs Lisp programs need not call this function, as make-frame-on-display calls it automatically. The only reason for calling it is to check whether communication can be established with a given X display.

The optional argument xrm-string, if not nil, is a string of resource names and values, in the same format used in the .Xresources file. See X Resources in The GNU Emacs Manual. These values apply to all Emacs frames created on this display, overriding the resource values recorded in the X server. Here’s an example of what this string might look like:

"*BorderWidth: 3\n*InternalBorder: 2\n"

If must-succeed is non-nil, failure to open the connection terminates Emacs. Otherwise, it is an ordinary Lisp error.

Function: x-close-connection display

This function closes the connection to display display. Before you can do this, you must first delete all the frames that were open on that display (see section Deleting Frames).

On some “multi-monitor” setups, a single X display outputs to more than one physical monitor. You can use the functions display-monitor-attributes-list and frame-monitor-attributes to obtain information about such setups.

Function: display-monitor-attributes-list &optional display

This function returns a list of physical monitor attributes on display, which can be a display name (a string), a terminal, or a frame; if omitted or nil, it defaults to the selected frame’s display. Each element of the list is an association list, representing the attributes of a physical monitor. The first element corresponds to the primary monitor. The attribute keys and values are:

geometry

Position of the top-left corner of the monitor’s screen and its size, in pixels, as ‘(x y width height)’. Note that, if the monitor is not the primary monitor, some of the coordinates might be negative.

workarea

Position of the top-left corner and size of the work area (“usable” space) in pixels as ‘(x y width height)’. This may be different from ‘geometry’ in that space occupied by various window manager features (docks, taskbars, etc.) may be excluded from the work area. Whether or not such features actually subtract from the work area depends on the platform and environment. Again, if the monitor is not the primary monitor, some of the coordinates might be negative.

mm-size

Width and height in millimeters as ‘(width height)

frames

List of frames that this physical monitor dominates (see below).

name

Name of the physical monitor as string.

source

Source of the multi-monitor information as string; e.g., ‘XRandr’ or ‘Xinerama’.

x, y, width, and height are integers. ‘name’ and ‘source’ may be absent.

A frame is dominated by a physical monitor when either the largest area of the frame resides in that monitor, or (if the frame does not intersect any physical monitors) that monitor is the closest to the frame. Every (non-tooltip) frame (whether visible or not) in a graphical display is dominated by exactly one physical monitor at a time, though the frame can span multiple (or no) physical monitors.

Here’s an example of the data produced by this function on a 2-monitor display:

  (display-monitor-attributes-list)
  ⇒
  (((geometry 0 0 1920 1080) ;; Left-hand, primary monitor
    (workarea 0 0 1920 1050) ;; A taskbar occupies some of the height
    (mm-size 677 381)
    (name . "DISPLAY1")
    (frames #<frame emacs@host *Messages* 0x11578c0>
            #<frame emacs@host *scratch* 0x114b838>))
   ((geometry 1920 0 1680 1050) ;; Right-hand monitor
    (workarea 1920 0 1680 1050) ;; Whole screen can be used
    (mm-size 593 370)
    (name . "DISPLAY2")
    (frames)))
Function: frame-monitor-attributes &optional frame

This function returns the attributes of the physical monitor dominating (see above) frame, which defaults to the selected frame.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3 Frame Parameters

A frame has many parameters that control its appearance and behavior. Just what parameters a frame has depends on what display mechanism it uses.

Frame parameters exist mostly for the sake of graphical displays. Most frame parameters have no effect when applied to a frame on a text terminal; only the height, width, name, title, menu-bar-lines, buffer-list and buffer-predicate parameters do something special. If the terminal supports colors, the parameters foreground-color, background-color, background-mode and display-type are also meaningful. If the terminal supports frame transparency, the parameter alpha is also meaningful.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.1 Access to Frame Parameters

These functions let you read and change the parameter values of a frame.

Function: frame-parameter frame parameter

This function returns the value of the parameter parameter (a symbol) of frame. If frame is nil, it returns the selected frame’s parameter. If frame has no setting for parameter, this function returns nil.

Function: frame-parameters &optional frame

The function frame-parameters returns an alist listing all the parameters of frame and their values. If frame is nil or omitted, this returns the selected frame’s parameters

Function: modify-frame-parameters frame alist

This function alters the parameters of frame frame based on the elements of alist. Each element of alist has the form (parm . value), where parm is a symbol naming a parameter. If you don’t mention a parameter in alist, its value doesn’t change. If frame is nil, it defaults to the selected frame.

Function: set-frame-parameter frame parm value

This function sets the frame parameter parm to the specified value. If frame is nil, it defaults to the selected frame.

Function: modify-all-frames-parameters alist

This function alters the frame parameters of all existing frames according to alist, then modifies default-frame-alist (and, if necessary, initial-frame-alist) to apply the same parameter values to frames that will be created henceforth.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.2 Initial Frame Parameters

You can specify the parameters for the initial startup frame by setting initial-frame-alist in your init file (see section The Init File).

User Option: initial-frame-alist

This variable’s value is an alist of parameter values used when creating the initial frame. You can set this variable to specify the appearance of the initial frame without altering subsequent frames. Each element has the form:

(parameter . value)

Emacs creates the initial frame before it reads your init file. After reading that file, Emacs checks initial-frame-alist, and applies the parameter settings in the altered value to the already created initial frame.

If these settings affect the frame geometry and appearance, you’ll see the frame appear with the wrong ones and then change to the specified ones. If that bothers you, you can specify the same geometry and appearance with X resources; those do take effect before the frame is created. See X Resources in The GNU Emacs Manual.

X resource settings typically apply to all frames. If you want to specify some X resources solely for the sake of the initial frame, and you don’t want them to apply to subsequent frames, here’s how to achieve this. Specify parameters in default-frame-alist to override the X resources for subsequent frames; then, to prevent these from affecting the initial frame, specify the same parameters in initial-frame-alist with values that match the X resources.

If these parameters include (minibuffer . nil), that indicates that the initial frame should have no minibuffer. In this case, Emacs creates a separate minibuffer-only frame as well.

User Option: minibuffer-frame-alist

This variable’s value is an alist of parameter values used when creating an initial minibuffer-only frame (i.e., the minibuffer-only frame that Emacs creates if initial-frame-alist specifies a frame with no minibuffer).

User Option: default-frame-alist

This is an alist specifying default values of frame parameters for all Emacs frames—the first frame, and subsequent frames. When using the X Window System, you can get the same results by means of X resources in many cases.

Setting this variable does not affect existing frames. Furthermore, functions that display a buffer in a separate frame may override the default parameters by supplying their own parameters.

If you invoke Emacs with command-line options that specify frame appearance, those options take effect by adding elements to either initial-frame-alist or default-frame-alist. Options which affect just the initial frame, such as ‘--geometry’ and ‘--maximized’, add to initial-frame-alist; the others add to default-frame-alist. see Command Line Arguments for Emacs Invocation in The GNU Emacs Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3 Window Frame Parameters

Just what parameters a frame has depends on what display mechanism it uses. This section describes the parameters that have special meanings on some or all kinds of terminals. Of these, name, title, height, width, buffer-list and buffer-predicate provide meaningful information in terminal frames, and tty-color-mode is meaningful only for frames on text terminals.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.1 Basic Parameters

These frame parameters give the most basic information about the frame. title and name are meaningful on all terminals.

display

The display on which to open this frame. It should be a string of the form ‘host:dpy.screen’, just like the DISPLAY environment variable. See section Multiple Terminals, for more details about display names.

display-type

This parameter describes the range of possible colors that can be used in this frame. Its value is color, grayscale or mono.

title

If a frame has a non-nil title, it appears in the window system’s title bar at the top of the frame, and also in the mode line of windows in that frame if mode-line-frame-identification uses ‘%F’ (see section %-Constructs in the Mode Line). This is normally the case when Emacs is not using a window system, and can only display one frame at a time. See section Frame Titles.

name

The name of the frame. The frame name serves as a default for the frame title, if the title parameter is unspecified or nil. If you don’t specify a name, Emacs sets the frame name automatically (see section Frame Titles).

If you specify the frame name explicitly when you create the frame, the name is also used (instead of the name of the Emacs executable) when looking up X resources for the frame.

explicit-name

If the frame name was specified explicitly when the frame was created, this parameter will be that name. If the frame wasn’t explicitly named, this parameter will be nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.2 Position Parameters

Position parameters’ values are normally measured in pixels, but on text terminals they count characters or lines instead.

left

The position, in pixels, of the left (or right) edge of the frame with respect to the left (or right) edge of the screen. The value may be:

an integer

A positive integer relates the left edge of the frame to the left edge of the screen. A negative integer relates the right frame edge to the right screen edge.

(+ pos)

This specifies the position of the left frame edge relative to the left screen edge. The integer pos may be positive or negative; a negative value specifies a position outside the screen or on a monitor other than the primary one (for multi-monitor displays).

(- pos)

This specifies the position of the right frame edge relative to the right screen edge. The integer pos may be positive or negative; a negative value specifies a position outside the screen or on a monitor other than the primary one (for multi-monitor displays).

Some window managers ignore program-specified positions. If you want to be sure the position you specify is not ignored, specify a non-nil value for the user-position parameter as well.

top

The screen position of the top (or bottom) edge, in pixels, with respect to the top (or bottom) edge of the screen. It works just like left, except vertically instead of horizontally.

icon-left

The screen position of the left edge of the frame’s icon, in pixels, counting from the left edge of the screen. This takes effect when the frame is iconified, if the window manager supports this feature. If you specify a value for this parameter, then you must also specify a value for icon-top and vice versa.

icon-top

The screen position of the top edge of the frame’s icon, in pixels, counting from the top edge of the screen. This takes effect when the frame is iconified, if the window manager supports this feature.

user-position

When you create a frame and specify its screen position with the left and top parameters, use this parameter to say whether the specified position was user-specified (explicitly requested in some way by a human user) or merely program-specified (chosen by a program). A non-nil value says the position was user-specified.

Window managers generally heed user-specified positions, and some heed program-specified positions too. But many ignore program-specified positions, placing the window in a default fashion or letting the user place it with the mouse. Some window managers, including twm, let the user specify whether to obey program-specified positions or ignore them.

When you call make-frame, you should specify a non-nil value for this parameter if the values of the left and top parameters represent the user’s stated preference; otherwise, use nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.3 Size Parameters

Frame parameters specify frame sizes in character units. On graphical displays, the default face determines the actual pixel sizes of these character units (see section Face Attributes).

height

The height of the frame contents, in characters. (To get the height in pixels, call frame-pixel-height; see Frame Size And Position.)

width

The width of the frame contents, in characters. (To get the width in pixels, call frame-pixel-width; see Frame Size And Position.)

user-size

This does for the size parameters height and width what the user-position parameter (see section user-position) does for the position parameters top and left.

fullscreen

Specify that width, height or both shall be maximized. The value fullwidth specifies that width shall be as wide as possible. The value fullheight specifies that height shall be as tall as possible. The value fullboth specifies that both the width and the height shall be set to the size of the screen. The value maximized specifies that the frame shall be maximized. The difference between maximized and fullboth is that the former can still be resized by dragging window manager decorations with the mouse, while the latter really covers the whole screen and does not allow resizing by mouse dragging.

With some window managers you may have to customize the variable frame-resize-pixelwise to a non-nil value in order to make a frame appear “maximized” or “fullscreen”.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.4 Layout Parameters

These frame parameters enable or disable various parts of the frame, or control their sizes.

border-width

The width in pixels of the frame’s border.

internal-border-width

The distance in pixels between text (or fringe) and the frame’s border.

vertical-scroll-bars

Whether the frame has scroll bars for vertical scrolling, and which side of the frame they should be on. The possible values are left, right, and nil for no scroll bars.

scroll-bar-width

The width of vertical scroll bars, in pixels, or nil meaning to use the default width.

left-fringe
right-fringe

The default width of the left and right fringes of windows in this frame (see section Fringes). If either of these is zero, that effectively removes the corresponding fringe.

When you use frame-parameter to query the value of either of these two frame parameters, the return value is always an integer. When using set-frame-parameter, passing a nil value imposes an actual default value of 8 pixels.

The combined fringe widths must add up to an integral number of columns, so the actual default fringe widths for the frame, as reported by frame-parameter, may be larger than what you specify. Any extra width is distributed evenly between the left and right fringe. However, you can force one fringe or the other to a precise width by specifying that width as a negative integer. If both widths are negative, only the left fringe gets the specified width.

right-divider-width

The width (thickness) reserved for the right divider (see section Window Dividers) of any window on the frame, in pixels. A value of zero means to not draw right dividers.

bottom-divider-width

The width (thickness) reserved for the bottom divider (see section Window Dividers) of any window on the frame, in pixels. A value of zero means to not draw bottom dividers.

menu-bar-lines

The number of lines to allocate at the top of the frame for a menu bar. The default is 1 if Menu Bar mode is enabled, and 0 otherwise. See Menu Bars in The GNU Emacs Manual.

tool-bar-lines

The number of lines to use for the tool bar. The default is 1 if Tool Bar mode is enabled, and 0 otherwise. See Tool Bars in The GNU Emacs Manual.

tool-bar-position

The position of the tool bar. Currently only for the GTK tool bar. Value can be one of top, bottom left, right. The default is top.

line-spacing

Additional space to leave below each text line, in pixels (a positive integer). See section Line Height, for more information.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.5 Buffer Parameters

These frame parameters, meaningful on all kinds of terminals, deal with which buffers have been, or should, be displayed in the frame.

minibuffer

Whether this frame has its own minibuffer. The value t means yes, nil means no, only means this frame is just a minibuffer. If the value is a minibuffer window (in some other frame), the frame uses that minibuffer.

This frame parameter takes effect when the frame is created, and can not be changed afterwards.

buffer-predicate

The buffer-predicate function for this frame. The function other-buffer uses this predicate (from the selected frame) to decide which buffers it should consider, if the predicate is not nil. It calls the predicate with one argument, a buffer, once for each buffer; if the predicate returns a non-nil value, it considers that buffer.

buffer-list

A list of buffers that have been selected in this frame, ordered most-recently-selected first.

unsplittable

If non-nil, this frame’s window is never split automatically.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.6 Window Management Parameters

The following frame parameters control various aspects of the frame’s interaction with the window manager. They have no effect on text terminals.

visibility

The state of visibility of the frame. There are three possibilities: nil for invisible, t for visible, and icon for iconified. See section Visibility of Frames.

auto-raise

If non-nil, Emacs automatically raises the frame when it is selected. Some window managers do not allow this.

auto-lower

If non-nil, Emacs automatically lowers the frame when it is deselected. Some window managers do not allow this.

icon-type

The type of icon to use for this frame. If the value is a string, that specifies a file containing a bitmap to use; nil specifies no icon (in which case the window manager decides what to show); any other non-nil value specifies the default Emacs icon.

icon-name

The name to use in the icon for this frame, when and if the icon appears. If this is nil, the frame’s title is used.

window-id

The ID number which the graphical display uses for this frame. Emacs assigns this parameter when the frame is created; changing the parameter has no effect on the actual ID number.

outer-window-id

The ID number of the outermost window-system window in which the frame exists. As with window-id, changing this parameter has no actual effect.

wait-for-wm

If non-nil, tell Xt to wait for the window manager to confirm geometry changes. Some window managers, including versions of Fvwm2 and KDE, fail to confirm, so Xt hangs. Set this to nil to prevent hanging with those window managers.

sticky

If non-nil, the frame is visible on all virtual desktops on systems with virtual desktops.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.7 Cursor Parameters

This frame parameter controls the way the cursor looks.

cursor-type

How to display the cursor. Legitimate values are:

box

Display a filled box. (This is the default.)

hollow

Display a hollow box.

nil

Don’t display a cursor.

bar

Display a vertical bar between characters.

(bar . width)

Display a vertical bar width pixels wide between characters.

hbar

Display a horizontal bar.

(hbar . height)

Display a horizontal bar height pixels high.

The cursor-type frame parameter may be overridden by the variables cursor-type and cursor-in-non-selected-windows:

Variable: cursor-type

This buffer-local variable controls how the cursor looks in a selected window showing the buffer. If its value is t, that means to use the cursor specified by the cursor-type frame parameter. Otherwise, the value should be one of the cursor types listed above, and it overrides the cursor-type frame parameter.

User Option: cursor-in-non-selected-windows

This buffer-local variable controls how the cursor looks in a window that is not selected. It supports the same values as the cursor-type frame parameter; also, nil means don’t display a cursor in nonselected windows, and t (the default) means use a standard modification of the usual cursor type (solid box becomes hollow box, and bar becomes a narrower bar).

User Option: blink-cursor-alist

This variable specifies how to blink the cursor. Each element has the form (on-state . off-state). Whenever the cursor type equals on-state (comparing using equal), the corresponding off-state specifies what the cursor looks like when it blinks “off”. Both on-state and off-state should be suitable values for the cursor-type frame parameter.

There are various defaults for how to blink each type of cursor, if the type is not mentioned as an on-state here. Changes in this variable do not take effect immediately, only when you specify the cursor-type frame parameter.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.8 Font and Color Parameters

These frame parameters control the use of fonts and colors.

font-backend

A list of symbols, specifying the font backends to use for drawing fonts in the frame, in order of priority. On X, there are currently two available font backends: x (the X core font driver) and xft (the Xft font driver). On MS-Windows, there are currently two available font backends: gdi and uniscribe (see Windows Fonts in The GNU Emacs Manual). On other systems, there is only one available font backend, so it does not make sense to modify this frame parameter.

background-mode

This parameter is either dark or light, according to whether the background color is a light one or a dark one.

tty-color-mode

This parameter overrides the terminal’s color support as given by the system’s terminal capabilities database in that this parameter’s value specifies the color mode to use on a text terminal. The value can be either a symbol or a number. A number specifies the number of colors to use (and, indirectly, what commands to issue to produce each color). For example, (tty-color-mode . 8) specifies use of the ANSI escape sequences for 8 standard text colors. A value of -1 turns off color support.

If the parameter’s value is a symbol, it specifies a number through the value of tty-color-mode-alist, and the associated number is used instead.

screen-gamma

If this is a number, Emacs performs “gamma correction” which adjusts the brightness of all colors. The value should be the screen gamma of your display.

Usual PC monitors have a screen gamma of 2.2, so color values in Emacs, and in X windows generally, are calibrated to display properly on a monitor with that gamma value. If you specify 2.2 for screen-gamma, that means no correction is needed. Other values request correction, designed to make the corrected colors appear on your screen the way they would have appeared without correction on an ordinary monitor with a gamma value of 2.2.

If your monitor displays colors too light, you should specify a screen-gamma value smaller than 2.2. This requests correction that makes colors darker. A screen gamma value of 1.5 may give good results for LCD color displays.

alpha

This parameter specifies the opacity of the frame, on graphical displays that support variable opacity. It should be an integer between 0 and 100, where 0 means completely transparent and 100 means completely opaque. It can also have a nil value, which tells Emacs not to set the frame opacity (leaving it to the window manager).

To prevent the frame from disappearing completely from view, the variable frame-alpha-lower-limit defines a lower opacity limit. If the value of the frame parameter is less than the value of this variable, Emacs uses the latter. By default, frame-alpha-lower-limit is 20.

The alpha frame parameter can also be a cons cell (‘active’ . ‘inactive’), where ‘active’ is the opacity of the frame when it is selected, and ‘inactive’ is the opacity when it is not selected.

The following frame parameters are semi-obsolete in that they are automatically equivalent to particular face attributes of particular faces (see Standard Faces in The Emacs Manual):

font

The name of the font for displaying text in the frame. This is a string, either a valid font name for your system or the name of an Emacs fontset (see section Fontsets). It is equivalent to the font attribute of the default face.

foreground-color

The color to use for the image of a character. It is equivalent to the :foreground attribute of the default face.

background-color

The color to use for the background of characters. It is equivalent to the :background attribute of the default face.

mouse-color

The color for the mouse pointer. It is equivalent to the :background attribute of the mouse face.

cursor-color

The color for the cursor that shows point. It is equivalent to the :background attribute of the cursor face.

border-color

The color for the border of the frame. It is equivalent to the :background attribute of the border face.

scroll-bar-foreground

If non-nil, the color for the foreground of scroll bars. It is equivalent to the :foreground attribute of the scroll-bar face.

scroll-bar-background

If non-nil, the color for the background of scroll bars. It is equivalent to the :background attribute of the scroll-bar face.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.4 Frame Size And Position

You can read or change the size and position of a frame using the frame parameters left, top, height, and width. Whatever geometry parameters you don’t specify are chosen by the window manager in its usual fashion.

Here are some special features for working with sizes and positions. (For the precise meaning of “selected frame” used by these functions, see Input Focus.)

Function: set-frame-position frame left top

This function sets the position of the top left corner of frame to left and top. These arguments are measured in pixels, and normally count from the top left corner of the screen.

Negative parameter values position the bottom edge of the window up from the bottom edge of the screen, or the right window edge to the left of the right edge of the screen. It would probably be better if the values were always counted from the left and top, so that negative arguments would position the frame partly off the top or left edge of the screen, but it seems inadvisable to change that now.

Function: frame-height &optional frame
Function: frame-width &optional frame

These functions return the height and width of frame, measured in lines and columns. If you don’t supply frame, they use the selected frame.

Function: frame-pixel-height &optional frame
Function: frame-pixel-width &optional frame

These functions return the height and width of the main display area of frame, measured in pixels. If you don’t supply frame, they use the selected frame. For a text terminal, the results are in characters rather than pixels.

These values include the internal borders, and windows’ scroll bars and fringes (which belong to individual windows, not to the frame itself). The exact value of the heights depends on the window-system and toolkit in use. With GTK+, the height does not include any tool bar or menu bar. With the Motif or Lucid toolkits, it includes the tool bar but not the menu bar. In a graphical version with no toolkit, it includes both the tool bar and menu bar. For a text terminal, the result includes the menu bar.

Function: frame-char-height &optional frame
Function: frame-char-width &optional frame

These functions return the height and width of a character in frame, measured in pixels. The values depend on the choice of font. If you don’t supply frame, these functions use the selected frame.

User Option: frame-resize-pixelwise

If this option is nil, a frame’s size is usually rounded to a multiple of the current values of that frame’s frame-char-height and frame-char-width. If this is non-nil, no rounding occurs, hence frame sizes can increase/decrease by one pixel.

Setting this causes the next resize operation to pass the corresponding size hints to the window manager. This means that this variable should be set only in a user’s initial file; applications should never bind it temporarily.

The precise meaning of a value of nil for this option depends on the toolkit used. Dragging the frame border with the mouse is usually done character-wise. Calling set-frame-size (see below) with arguments that do not specify the frame size as an integer multiple of its character size, however, may: be ignored, cause a rounding (GTK+), or be accepted (Lucid, Motif, MS-Windows).

With some window managers you may have to set this to non-nil in order to make a frame appear truly “maximized” or “fullscreen”.

Function: set-frame-size frame width height pixelwise

This function sets the size of frame, measured in characters; width and height specify the new width in columns and the new height in lines.

The optional argument pixelwise non-nil means to measure the new width and height in units of pixels instead. Note that if frame-resize-pixelwise is nil, some toolkits may refuse to fully honor the request if it does not increase/decrease the frame size to a multiple of its character size.

Function: set-frame-height frame height &optional pretend pixelwise

This function resizes frame to a height of height lines. The sizes of existing windows in frame are altered proportionally to fit.

If pretend is non-nil, then Emacs displays height lines of output in frame, but does not change its value for the actual height of the frame. This is only useful on text terminals. Using a smaller height than the terminal actually implements may be useful to reproduce behavior observed on a smaller screen, or if the terminal malfunctions when using its whole screen. Setting the frame height “for real” does not always work, because knowing the correct actual size may be necessary for correct cursor positioning on text terminals.

The optional fourth argument pixelwise non-nil means that frame should be height pixels high. Note that if frame-resize-pixelwise is nil, some toolkits may refuse to fully honor the request if it does not increase/decrease the frame height to a multiple of its character height.

Function: set-frame-width frame width &optional pretend pixelwise

This function sets the width of frame, measured in characters. The argument pretend has the same meaning as in set-frame-height.

The optional fourth argument pixelwise non-nil means that frame should be width pixels wide. Note that if frame-resize-pixelwise is nil, some toolkits may refuse to fully honor the request if it does not increase/decrease the frame width to a multiple of its character width.

If you have a frame that displays only one window, you can fit that frame to its buffer using the command fit-frame-to-buffer.

Command: fit-frame-to-buffer &optional frame max-height min-height max-width min-width only

This command adjusts the size of frame to display the contents of its buffer exactly. frame can be any live frame and defaults to the selected one. Fitting is done only if frame’s root window is live. The arguments max-height, min-height, max-width and min-width specify bounds on the new total size of frame’s root window. min-height and min-width default to the values of window-min-height and window-min-width respectively.

If the optional argument only is vertically, this function may resize the frame vertically only. If only is horizontally, it may resize the frame horizontally only.

The behavior of fit-frame-to-buffer can be controlled with the help of the two options listed next.

User Option: fit-frame-to-buffer-margins

This option can be used to specify margins around frames to be fit by fit-frame-to-buffer. Such margins can be useful to avoid, for example, that such frames overlap the taskbar.

It specifies the numbers of pixels to be left free on the left, above, the right, and below a frame that shall be fit. The default specifies nil for each which means to use no margins. The value specified here can be overridden for a specific frame by that frame’s fit-frame-to-buffer-margins parameter, if present.

User Option: fit-frame-to-buffer-sizes

This option specifies size boundaries for fit-frame-to-buffer. It specifies the total maximum and minimum lines and maximum and minimum columns of the root window of any frame that shall be fit to its buffer. If any of these values is non-nil, it overrides the corresponding argument of fit-frame-to-buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.5 Geometry

Here’s how to examine the data in an X-style window geometry specification:

Function: x-parse-geometry geom

The function x-parse-geometry converts a standard X window geometry string to an alist that you can use as part of the argument to make-frame.

The alist describes which parameters were specified in geom, and gives the values specified for them. Each element looks like (parameter . value). The possible parameter values are left, top, width, and height.

For the size parameters, the value must be an integer. The position parameter names left and top are not totally accurate, because some values indicate the position of the right or bottom edges instead. The value possibilities for the position parameters are: an integer, a list (+ pos), or a list (- pos); as previously described (see section Position Parameters).

Here is an example:

(x-parse-geometry "35x70+0-0")
     ⇒ ((height . 70) (width . 35)
         (top - 0) (left . 0))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.4 Terminal Parameters

Each terminal has a list of associated parameters. These terminal parameters are mostly a convenient way of storage for terminal-local variables, but some terminal parameters have a special meaning.

This section describes functions to read and change the parameter values of a terminal. They all accept as their argument either a terminal or a frame; the latter means use that frame’s terminal. An argument of nil means the selected frame’s terminal.

Function: terminal-parameters &optional terminal

This function returns an alist listing all the parameters of terminal and their values.

Function: terminal-parameter terminal parameter

This function returns the value of the parameter parameter (a symbol) of terminal. If terminal has no setting for parameter, this function returns nil.

Function: set-terminal-parameter terminal parameter value

This function sets the parameter parm of terminal to the specified value, and returns the previous value of that parameter.

Here’s a list of a few terminal parameters that have a special meaning:

background-mode

The classification of the terminal’s background color, either light or dark.

normal-erase-is-backspace

Value is either 1 or 0, depending on whether normal-erase-is-backspace-mode is turned on or off on this terminal. See DEL Does Not Delete in The Emacs Manual.

terminal-initted

After the terminal is initialized, this is set to the terminal-specific initialization function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.5 Frame Titles

Every frame has a name parameter; this serves as the default for the frame title which window systems typically display at the top of the frame. You can specify a name explicitly by setting the name frame property.

Normally you don’t specify the name explicitly, and Emacs computes the frame name automatically based on a template stored in the variable frame-title-format. Emacs recomputes the name each time the frame is redisplayed.

Variable: frame-title-format

This variable specifies how to compute a name for a frame when you have not explicitly specified one. The variable’s value is actually a mode line construct, just like mode-line-format, except that the ‘%c’ and ‘%l’ constructs are ignored. See section The Data Structure of the Mode Line.

Variable: icon-title-format

This variable specifies how to compute the name for an iconified frame, when you have not explicitly specified the frame title. This title appears in the icon itself.

Variable: multiple-frames

This variable is set automatically by Emacs. Its value is t when there are two or more frames (not counting minibuffer-only frames or invisible frames). The default value of frame-title-format uses multiple-frames so as to put the buffer name in the frame title only when there is more than one frame.

The value of this variable is not guaranteed to be accurate except while processing frame-title-format or icon-title-format.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.6 Deleting Frames

A live frame is one that has not been deleted. When a frame is deleted, it is removed from its terminal display, although it may continue to exist as a Lisp object until there are no more references to it.

Command: delete-frame &optional frame force

This function deletes the frame frame. Unless frame is a tooltip, it first runs the hook delete-frame-functions (each function gets one argument, frame). By default, frame is the selected frame.

A frame cannot be deleted if its minibuffer is used by other frames. Normally, you cannot delete a frame if all other frames are invisible, but if force is non-nil, then you are allowed to do so.

Function: frame-live-p frame

The function frame-live-p returns non-nil if the frame frame has not been deleted. The possible non-nil return values are like those of framep. See section Frames.

Some window managers provide a command to delete a window. These work by sending a special message to the program that operates the window. When Emacs gets one of these commands, it generates a delete-frame event, whose normal definition is a command that calls the function delete-frame. See section Miscellaneous System Events.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.7 Finding All Frames

Function: frame-list

This function returns a list of all the live frames, i.e., those that have not been deleted. It is analogous to buffer-list for buffers, and includes frames on all terminals. The list that you get is newly created, so modifying the list doesn’t have any effect on the internals of Emacs.

Function: visible-frame-list

This function returns a list of just the currently visible frames. See section Visibility of Frames. Frames on text terminals always count as “visible”, even though only the selected one is actually displayed.

Function: next-frame &optional frame minibuf

This function lets you cycle conveniently through all the frames on the current display from an arbitrary starting point. It returns the “next” frame after frame in the cycle. If frame is omitted or nil, it defaults to the selected frame (see section Input Focus).

The second argument, minibuf, says which frames to consider:

nil

Exclude minibuffer-only frames.

visible

Consider all visible frames.

0

Consider all visible or iconified frames.

a window

Consider only the frames using that particular window as their minibuffer.

anything else

Consider all frames.

Function: previous-frame &optional frame minibuf

Like next-frame, but cycles through all frames in the opposite direction.

See also next-window and previous-window, in Cyclic Ordering of Windows.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.8 Minibuffers and Frames

Normally, each frame has its own minibuffer window at the bottom, which is used whenever that frame is selected. If the frame has a minibuffer, you can get it with minibuffer-window (see Definition of minibuffer-window).

However, you can also create a frame with no minibuffer. Such a frame must use the minibuffer window of some other frame. When you create the frame, you can explicitly specify the minibuffer window to use (in some other frame). If you don’t, then the minibuffer is found in the frame which is the value of the variable default-minibuffer-frame. Its value should be a frame that does have a minibuffer.

If you use a minibuffer-only frame, you might want that frame to raise when you enter the minibuffer. If so, set the variable minibuffer-auto-raise to t. See section Raising and Lowering Frames.

Variable: default-minibuffer-frame

This variable specifies the frame to use for the minibuffer window, by default. It does not affect existing frames. It is always local to the current terminal and cannot be buffer-local. See section Multiple Terminals.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.9 Input Focus

At any time, one frame in Emacs is the selected frame. The selected window always resides on the selected frame.

When Emacs displays its frames on several terminals (see section Multiple Terminals), each terminal has its own selected frame. But only one of these is “the selected frame”: it’s the frame that belongs to the terminal from which the most recent input came. That is, when Emacs runs a command that came from a certain terminal, the selected frame is the one of that terminal. Since Emacs runs only a single command at any given time, it needs to consider only one selected frame at a time; this frame is what we call the selected frame in this manual. The display on which the selected frame is shown is the selected frame’s display.

Function: selected-frame

This function returns the selected frame.

Some window systems and window managers direct keyboard input to the window object that the mouse is in; others require explicit clicks or commands to shift the focus to various window objects. Either way, Emacs automatically keeps track of which frame has the focus. To explicitly switch to a different frame from a Lisp function, call select-frame-set-input-focus.

Lisp programs can also switch frames “temporarily” by calling the function select-frame. This does not alter the window system’s concept of focus; rather, it escapes from the window manager’s control until that control is somehow reasserted.

When using a text terminal, only one frame can be displayed at a time on the terminal, so after a call to select-frame, the next redisplay actually displays the newly selected frame. This frame remains selected until a subsequent call to select-frame. Each frame on a text terminal has a number which appears in the mode line before the buffer name (see section Variables Used in the Mode Line).

Function: select-frame-set-input-focus frame &optional norecord

This function selects frame, raises it (should it happen to be obscured by other frames) and tries to give it the X server’s focus. On a text terminal, the next redisplay displays the new frame on the entire terminal screen. The optional argument norecord has the same meaning as for select-frame (see below). The return value of this function is not significant.

Command: select-frame frame &optional norecord

This function selects frame frame, temporarily disregarding the focus of the X server if any. The selection of frame lasts until the next time the user does something to select a different frame, or until the next time this function is called. (If you are using a window system, the previously selected frame may be restored as the selected frame after return to the command loop, because it still may have the window system’s input focus.)

The specified frame becomes the selected frame, and its terminal becomes the selected terminal. This function then calls select-window as a subroutine, passing the window selected within frame as its first argument and norecord as its second argument (hence, if norecord is non-nil, this avoids changing the order of recently selected windows nor the buffer list). See section Selecting Windows.

This function returns frame, or nil if frame has been deleted.

In general, you should never use select-frame in a way that could switch to a different terminal without switching back when you’re done.

Emacs cooperates with the window system by arranging to select frames as the server and window manager request. It does so by generating a special kind of input event, called a focus event, when appropriate. The command loop handles a focus event by calling handle-switch-frame. See section Focus Events.

Command: handle-switch-frame frame

This function handles a focus event by selecting frame frame.

Focus events normally do their job by invoking this command. Don’t call it for any other reason.

Function: redirect-frame-focus frame &optional focus-frame

This function redirects focus from frame to focus-frame. This means that focus-frame will receive subsequent keystrokes and events intended for frame. After such an event, the value of last-event-frame will be focus-frame. Also, switch-frame events specifying frame will instead select focus-frame.

If focus-frame is omitted or nil, that cancels any existing redirection for frame, which therefore once again receives its own events.

One use of focus redirection is for frames that don’t have minibuffers. These frames use minibuffers on other frames. Activating a minibuffer on another frame redirects focus to that frame. This puts the focus on the minibuffer’s frame, where it belongs, even though the mouse remains in the frame that activated the minibuffer.

Selecting a frame can also change focus redirections. Selecting frame bar, when foo had been selected, changes any redirections pointing to foo so that they point to bar instead. This allows focus redirection to work properly when the user switches from one frame to another using select-window.

This means that a frame whose focus is redirected to itself is treated differently from a frame whose focus is not redirected. select-frame affects the former but not the latter.

The redirection lasts until redirect-frame-focus is called to change it.

Variable: focus-in-hook

This is a normal hook run when an Emacs frame gains input focus.

Variable: focus-out-hook

This is a normal hook run when an Emacs frame loses input focus.

User Option: focus-follows-mouse

This option is how you inform Emacs whether the window manager transfers focus when the user moves the mouse. Non-nil says that it does. When this is so, the command other-frame moves the mouse to a position consistent with the new selected frame.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.10 Visibility of Frames

A frame on a graphical display may be visible, invisible, or iconified. If it is visible, its contents are displayed in the usual manner. If it is iconified, its contents are not displayed, but there is a little icon somewhere to bring the frame back into view (some window managers refer to this state as minimized rather than iconified, but from Emacs’ point of view they are the same thing). If a frame is invisible, it is not displayed at all.

Visibility is meaningless on text terminals, since only the selected one is actually displayed in any case.

Function: frame-visible-p frame

This function returns the visibility status of frame frame. The value is t if frame is visible, nil if it is invisible, and icon if it is iconified.

On a text terminal, all frames are considered “visible” for the purposes of this function, even though only one frame is displayed. See section Raising and Lowering Frames.

Command: iconify-frame &optional frame

This function iconifies frame frame. If you omit frame, it iconifies the selected frame.

Command: make-frame-visible &optional frame

This function makes frame frame visible. If you omit frame, it makes the selected frame visible. This does not raise the frame, but you can do that with raise-frame if you wish (see section Raising and Lowering Frames).

Command: make-frame-invisible &optional frame force

This function makes frame frame invisible. If you omit frame, it makes the selected frame invisible.

Unless force is non-nil, this function refuses to make frame invisible if all other frames are invisible..

The visibility status of a frame is also available as a frame parameter. You can read or change it as such. See section Window Management Parameters. The user can also iconify and deiconify frames with the window manager. This happens below the level at which Emacs can exert any control, but Emacs does provide events that you can use to keep track of such changes. See section Miscellaneous System Events.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.11 Raising and Lowering Frames

Most window systems use a desktop metaphor. Part of this metaphor is the idea that system-level windows (e.g., Emacs frames) are stacked in a notional third dimension perpendicular to the screen surface. Where two overlap, the one higher up covers the one underneath. You can raise or lower a frame using the functions raise-frame and lower-frame.

Command: raise-frame &optional frame

This function raises frame frame (default, the selected frame). If frame is invisible or iconified, this makes it visible.

Command: lower-frame &optional frame

This function lowers frame frame (default, the selected frame).

User Option: minibuffer-auto-raise

If this is non-nil, activation of the minibuffer raises the frame that the minibuffer window is in.

On window systems, you can also enable auto-raising (on frame selection) or auto-lowering (on frame deselection) using frame parameters. See section Window Management Parameters.

The concept of raising and lowering frames also applies to text terminal frames. On each text terminal, only the top frame is displayed at any one time.

Function: tty-top-frame terminal

This function returns the top frame on terminal. terminal should be a terminal object, a frame (meaning that frame’s terminal), or nil (meaning the selected frame’s terminal). If it does not refer to a text terminal, the return value is nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.12 Frame Configurations

A frame configuration records the current arrangement of frames, all their properties, and the window configuration of each one. (See section Window Configurations.)

Function: current-frame-configuration

This function returns a frame configuration list that describes the current arrangement of frames and their contents.

Function: set-frame-configuration configuration &optional nodelete

This function restores the state of frames described in configuration. However, this function does not restore deleted frames.

Ordinarily, this function deletes all existing frames not listed in configuration. But if nodelete is non-nil, the unwanted frames are iconified instead.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.13 Mouse Tracking

Sometimes it is useful to track the mouse, which means to display something to indicate where the mouse is and move the indicator as the mouse moves. For efficient mouse tracking, you need a way to wait until the mouse actually moves.

The convenient way to track the mouse is to ask for events to represent mouse motion. Then you can wait for motion by waiting for an event. In addition, you can easily handle any other sorts of events that may occur. That is useful, because normally you don’t want to track the mouse forever—only until some other event, such as the release of a button.

Special Form: track-mouse body…

This special form executes body, with generation of mouse motion events enabled. Typically, body would use read-event to read the motion events and modify the display accordingly. See section Motion Events, for the format of mouse motion events.

The value of track-mouse is that of the last form in body. You should design body to return when it sees the up-event that indicates the release of the button, or whatever kind of event means it is time to stop tracking.

The usual purpose of tracking mouse motion is to indicate on the screen the consequences of pushing or releasing a button at the current position.

In many cases, you can avoid the need to track the mouse by using the mouse-face text property (see section Properties with Special Meanings). That works at a much lower level and runs more smoothly than Lisp-level mouse tracking.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.14 Mouse Position

The functions mouse-position and set-mouse-position give access to the current position of the mouse.

Function: mouse-position

This function returns a description of the position of the mouse. The value looks like (frame x . y), where x and y are integers giving the position in characters relative to the top left corner of the inside of frame.

Variable: mouse-position-function

If non-nil, the value of this variable is a function for mouse-position to call. mouse-position calls this function just before returning, with its normal return value as the sole argument, and it returns whatever this function returns to it.

This abnormal hook exists for the benefit of packages like xt-mouse.el that need to do mouse handling at the Lisp level.

Function: set-mouse-position frame x y

This function warps the mouse to position x, y in frame frame. The arguments x and y are integers, giving the position in characters relative to the top left corner of the inside of frame. If frame is not visible, this function does nothing. The return value is not significant.

Function: mouse-pixel-position

This function is like mouse-position except that it returns coordinates in units of pixels rather than units of characters.

Function: set-mouse-pixel-position frame x y

This function warps the mouse like set-mouse-position except that x and y are in units of pixels rather than units of characters. These coordinates are not required to be within the frame.

If frame is not visible, this function does nothing. The return value is not significant.

Function: frame-pointer-visible-p &optional frame

This predicate function returns non-nil if the mouse pointer displayed on frame is visible; otherwise it returns nil. frame omitted or nil means the selected frame. This is useful when make-pointer-invisible is set to t: it allows to know if the pointer has been hidden. See Mouse Avoidance in The Emacs Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.15 Pop-Up Menus

A Lisp program can pop up a menu so that the user can choose an alternative with the mouse. On a text terminal, if the mouse is not available, the user can choose an alternative using the keyboard motion keys—C-n, C-p, or up- and down-arrow keys.

Function: x-popup-menu position menu

This function displays a pop-up menu and returns an indication of what selection the user makes.

The argument position specifies where on the screen to put the top left corner of the menu. It can be either a mouse button event (which says to put the menu where the user actuated the button) or a list of this form:

((xoffset yoffset) window)

where xoffset and yoffset are coordinates, measured in pixels, counting from the top left corner of window. window may be a window or a frame.

If position is t, it means to use the current mouse position (or the top-left corner of the frame if the mouse is not available on a text terminal). If position is nil, it means to precompute the key binding equivalents for the keymaps specified in menu, without actually displaying or popping up the menu.

The argument menu says what to display in the menu. It can be a keymap or a list of keymaps (see section Menu Keymaps). In this case, the return value is the list of events corresponding to the user’s choice. This list has more than one element if the choice occurred in a submenu. (Note that x-popup-menu does not actually execute the command bound to that sequence of events.) On text terminals and toolkits that support menu titles, the title is taken from the prompt string of menu if menu is a keymap, or from the prompt string of the first keymap in menu if it is a list of keymaps (see section Defining Menus).

Alternatively, menu can have the following form:

(title pane1 pane2...)

where each pane is a list of form

(title item1 item2...)

Each item should be a cons cell, (line . value), where line is a string and value is the value to return if that line is chosen. Unlike in a menu keymap, a nil value does not make the menu item non-selectable. Alternatively, each item can be a string rather than a cons cell; this makes a non-selectable menu item.

If the user gets rid of the menu without making a valid choice, for instance by clicking the mouse away from a valid choice or by typing C-g, then this normally results in a quit and x-popup-menu does not return. But if position is a mouse button event (indicating that the user invoked the menu with the mouse) then no quit occurs and x-popup-menu returns nil.

Usage note: Don’t use x-popup-menu to display a menu if you could do the job with a prefix key defined with a menu keymap. If you use a menu keymap to implement a menu, C-h c and C-h a can see the individual items in that menu and provide help for them. If instead you implement the menu by defining a command that calls x-popup-menu, the help facilities cannot know what happens inside that command, so they cannot give any help for the menu’s items.

The menu bar mechanism, which lets you switch between submenus by moving the mouse, cannot look within the definition of a command to see that it calls x-popup-menu. Therefore, if you try to implement a submenu using x-popup-menu, it cannot work with the menu bar in an integrated fashion. This is why all menu bar submenus are implemented with menu keymaps within the parent menu, and never with x-popup-menu. See section The Menu Bar.

If you want a menu bar submenu to have contents that vary, you should still use a menu keymap to implement it. To make the contents vary, add a hook function to menu-bar-update-hook to update the contents of the menu keymap as necessary.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.16 Dialog Boxes

A dialog box is a variant of a pop-up menu—it looks a little different, it always appears in the center of a frame, and it has just one level and one or more buttons. The main use of dialog boxes is for asking questions that the user can answer with “yes”, “no”, and a few other alternatives. With a single button, they can also force the user to acknowledge important information. The functions y-or-n-p and yes-or-no-p use dialog boxes instead of the keyboard, when called from commands invoked by mouse clicks.

Function: x-popup-dialog position contents &optional header

This function displays a pop-up dialog box and returns an indication of what selection the user makes. The argument contents specifies the alternatives to offer; it has this format:

(title (string . value)…)

which looks like the list that specifies a single pane for x-popup-menu.

The return value is value from the chosen alternative.

As for x-popup-menu, an element of the list may be just a string instead of a cons cell (string . value). That makes a box that cannot be selected.

If nil appears in the list, it separates the left-hand items from the right-hand items; items that precede the nil appear on the left, and items that follow the nil appear on the right. If you don’t include a nil in the list, then approximately half the items appear on each side.

Dialog boxes always appear in the center of a frame; the argument position specifies which frame. The possible values are as in x-popup-menu, but the precise coordinates or the individual window don’t matter; only the frame matters.

If header is non-nil, the frame title for the box is ‘Information’, otherwise it is ‘Question’. The former is used for message-box (see message-box). (On text terminals, the box title is not displayed.)

In some configurations, Emacs cannot display a real dialog box; so instead it displays the same items in a pop-up menu in the center of the frame.

If the user gets rid of the dialog box without making a valid choice, for instance using the window manager, then this produces a quit and x-popup-dialog does not return.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.17 Pointer Shape

You can specify the mouse pointer style for particular text or images using the pointer text property, and for images with the :pointer and :map image properties. The values you can use in these properties are text (or nil), arrow, hand, vdrag, hdrag, modeline, and hourglass. text stands for the usual mouse pointer style used over text.

Over void parts of the window (parts that do not correspond to any of the buffer contents), the mouse pointer usually uses the arrow style, but you can specify a different style (one of those above) by setting void-text-area-pointer.

User Option: void-text-area-pointer

This variable specifies the mouse pointer style for void text areas. These include the areas after the end of a line or below the last line in the buffer. The default is to use the arrow (non-text) pointer style.

When using X, you can specify what the text pointer style really looks like by setting the variable x-pointer-shape.

Variable: x-pointer-shape

This variable specifies the pointer shape to use ordinarily in the Emacs frame, for the text pointer style.

Variable: x-sensitive-text-pointer-shape

This variable specifies the pointer shape to use when the mouse is over mouse-sensitive text.

These variables affect newly created frames. They do not normally affect existing frames; however, if you set the mouse color of a frame, that also installs the current value of those two variables. See section Font and Color Parameters.

The values you can use, to specify either of these pointer shapes, are defined in the file lisp/term/x-win.el. Use M-x apropos RET x-pointer RET to see a list of them.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.18 Window System Selections

In the X window system, data can be transferred between different applications by means of selections. X defines an arbitrary number of selection types, each of which can store its own data; however, only three are commonly used: the clipboard, primary selection, and secondary selection. See Cut and Paste in The GNU Emacs Manual, for Emacs commands that make use of these selections. This section documents the low-level functions for reading and setting X selections.

Command: x-set-selection type data

This function sets an X selection. It takes two arguments: a selection type type, and the value to assign to it, data.

type should be a symbol; it is usually one of PRIMARY, SECONDARY or CLIPBOARD. These are symbols with upper-case names, in accord with X Window System conventions. If type is nil, that stands for PRIMARY.

If data is nil, it means to clear out the selection. Otherwise, data may be a string, a symbol, an integer (or a cons of two integers or list of two integers), an overlay, or a cons of two markers pointing to the same buffer. An overlay or a pair of markers stands for text in the overlay or between the markers. The argument data may also be a vector of valid non-vector selection values.

This function returns data.

Function: x-get-selection &optional type data-type

This function accesses selections set up by Emacs or by other X clients. It takes two optional arguments, type and data-type. The default for type, the selection type, is PRIMARY.

The data-type argument specifies the form of data conversion to use, to convert the raw data obtained from another X client into Lisp data. Meaningful values include TEXT, STRING, UTF8_STRING, TARGETS, LENGTH, DELETE, FILE_NAME, CHARACTER_POSITION, NAME, LINE_NUMBER, COLUMN_NUMBER, OWNER_OS, HOST_NAME, USER, CLASS, ATOM, and INTEGER. (These are symbols with upper-case names in accord with X conventions.) The default for data-type is STRING.

User Option: selection-coding-system

This variable specifies the coding system to use when reading and writing selections or the clipboard. See section Coding Systems. The default is compound-text-with-extensions, which converts to the text representation that X11 normally uses.

When Emacs runs on MS-Windows, it does not implement X selections in general, but it does support the clipboard. x-get-selection and x-set-selection on MS-Windows support the text data type only; if the clipboard holds other types of data, Emacs treats the clipboard as empty.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.19 Drag and Drop

When a user drags something from another application over Emacs, that other application expects Emacs to tell it if Emacs can handle the data that is dragged. The variable x-dnd-test-function is used by Emacs to determine what to reply. The default value is x-dnd-default-test-function which accepts drops if the type of the data to be dropped is present in x-dnd-known-types. You can customize x-dnd-test-function and/or x-dnd-known-types if you want Emacs to accept or reject drops based on some other criteria.

If you want to change the way Emacs handles drop of different types or add a new type, customize x-dnd-types-alist. This requires detailed knowledge of what types other applications use for drag and drop.

When an URL is dropped on Emacs it may be a file, but it may also be another URL type (ftp, http, etc.). Emacs first checks dnd-protocol-alist to determine what to do with the URL. If there is no match there and if browse-url-browser-function is an alist, Emacs looks for a match there. If no match is found the text for the URL is inserted. If you want to alter Emacs behavior, you can customize these variables.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.20 Color Names

A color name is text (usually in a string) that specifies a color. Symbolic names such as ‘black’, ‘white’, ‘red’, etc., are allowed; use M-x list-colors-display to see a list of defined names. You can also specify colors numerically in forms such as ‘#rgb’ and ‘RGB:r/g/b’, where r specifies the red level, g specifies the green level, and b specifies the blue level. You can use either one, two, three, or four hex digits for r; then you must use the same number of hex digits for all g and b as well, making either 3, 6, 9 or 12 hex digits in all. (See the documentation of the X Window System for more details about numerical RGB specification of colors.)

These functions provide a way to determine which color names are valid, and what they look like. In some cases, the value depends on the selected frame, as described below; see Input Focus, for the meaning of the term “selected frame”.

To read user input of color names with completion, use read-color (see section read-color).

Function: color-defined-p color &optional frame

This function reports whether a color name is meaningful. It returns t if so; otherwise, nil. The argument frame says which frame’s display to ask about; if frame is omitted or nil, the selected frame is used.

Note that this does not tell you whether the display you are using really supports that color. When using X, you can ask for any defined color on any kind of display, and you will get some result—typically, the closest it can do. To determine whether a frame can really display a certain color, use color-supported-p (see below).

This function used to be called x-color-defined-p, and that name is still supported as an alias.

Function: defined-colors &optional frame

This function returns a list of the color names that are defined and supported on frame frame (default, the selected frame). If frame does not support colors, the value is nil.

This function used to be called x-defined-colors, and that name is still supported as an alias.

Function: color-supported-p color &optional frame background-p

This returns t if frame can really display the color color (or at least something close to it). If frame is omitted or nil, the question applies to the selected frame.

Some terminals support a different set of colors for foreground and background. If background-p is non-nil, that means you are asking whether color can be used as a background; otherwise you are asking whether it can be used as a foreground.

The argument color must be a valid color name.

Function: color-gray-p color &optional frame

This returns t if color is a shade of gray, as defined on frame’s display. If frame is omitted or nil, the question applies to the selected frame. If color is not a valid color name, this function returns nil.

Function: color-values color &optional frame

This function returns a value that describes what color should ideally look like on frame. If color is defined, the value is a list of three integers, which give the amount of red, the amount of green, and the amount of blue. Each integer ranges in principle from 0 to 65535, but some displays may not use the full range. This three-element list is called the rgb values of the color.

If color is not defined, the value is nil.

(color-values "black")
     ⇒ (0 0 0)
(color-values "white")
     ⇒ (65280 65280 65280)
(color-values "red")
     ⇒ (65280 0 0)
(color-values "pink")
     ⇒ (65280 49152 51968)
(color-values "hungry")
     ⇒ nil

The color values are returned for frame’s display. If frame is omitted or nil, the information is returned for the selected frame’s display. If the frame cannot display colors, the value is nil.

This function used to be called x-color-values, and that name is still supported as an alias.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.21 Text Terminal Colors

Text terminals usually support only a small number of colors, and the computer uses small integers to select colors on the terminal. This means that the computer cannot reliably tell what the selected color looks like; instead, you have to inform your application which small integers correspond to which colors. However, Emacs does know the standard set of colors and will try to use them automatically.

The functions described in this section control how terminal colors are used by Emacs.

Several of these functions use or return rgb values, described in Color Names.

These functions accept a display (either a frame or the name of a terminal) as an optional argument. We hope in the future to make Emacs support different colors on different text terminals; then this argument will specify which terminal to operate on (the default being the selected frame’s terminal; see section Input Focus). At present, though, the frame argument has no effect.

Function: tty-color-define name number &optional rgb frame

This function associates the color name name with color number number on the terminal.

The optional argument rgb, if specified, is an rgb value, a list of three numbers that specify what the color actually looks like. If you do not specify rgb, then this color cannot be used by tty-color-approximate to approximate other colors, because Emacs will not know what it looks like.

Function: tty-color-clear &optional frame

This function clears the table of defined colors for a text terminal.

Function: tty-color-alist &optional frame

This function returns an alist recording the known colors supported by a text terminal.

Each element has the form (name number . rgb) or (name number). Here, name is the color name, number is the number used to specify it to the terminal. If present, rgb is a list of three color values (for red, green, and blue) that says what the color actually looks like.

Function: tty-color-approximate rgb &optional frame

This function finds the closest color, among the known colors supported for display, to that described by the rgb value rgb (a list of color values). The return value is an element of tty-color-alist.

Function: tty-color-translate color &optional frame

This function finds the closest color to color among the known colors supported for display and returns its index (an integer). If the name color is not defined, the value is nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.22 X Resources

This section describes some of the functions and variables for querying and using X resources, or their equivalent on your operating system. See X Resources in The GNU Emacs Manual, for more information about X resources.

Function: x-get-resource attribute class &optional component subclass

The function x-get-resource retrieves a resource value from the X Window defaults database.

Resources are indexed by a combination of a key and a class. This function searches using a key of the form ‘instance.attribute’ (where instance is the name under which Emacs was invoked), and using ‘Emacs.class’ as the class.

The optional arguments component and subclass add to the key and the class, respectively. You must specify both of them or neither. If you specify them, the key is ‘instance.component.attribute’, and the class is ‘Emacs.class.subclass’.

Variable: x-resource-class

This variable specifies the application name that x-get-resource should look up. The default value is "Emacs". You can examine X resources for application names other than “Emacs” by binding this variable to some other string, around a call to x-get-resource.

Variable: x-resource-name

This variable specifies the instance name that x-get-resource should look up. The default value is the name Emacs was invoked with, or the value specified with the ‘-name’ or ‘-rn’ switches.

To illustrate some of the above, suppose that you have the line:

xterm.vt100.background: yellow

in your X resources file (whose name is usually ~/.Xdefaults or ~/.Xresources). Then:

(let ((x-resource-class "XTerm") (x-resource-name "xterm"))
  (x-get-resource "vt100.background" "VT100.Background"))
     ⇒ "yellow"
(let ((x-resource-class "XTerm") (x-resource-name "xterm"))
  (x-get-resource "background" "VT100" "vt100" "Background"))
     ⇒ "yellow"
Variable: inhibit-x-resources

If this variable is non-nil, Emacs does not look up X resources, and X resources do not have any effect when creating new frames.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.23 Display Feature Testing

The functions in this section describe the basic capabilities of a particular display. Lisp programs can use them to adapt their behavior to what the display can do. For example, a program that ordinarily uses a popup menu could use the minibuffer if popup menus are not supported.

The optional argument display in these functions specifies which display to ask the question about. It can be a display name, a frame (which designates the display that frame is on), or nil (which refers to the selected frame’s display, see section Input Focus).

See section Color Names, Text Terminal Colors, for other functions to obtain information about displays.

Function: display-popup-menus-p &optional display

This function returns t if popup menus are supported on display, nil if not. Support for popup menus requires that the mouse be available, since the menu is popped up by clicking the mouse on some portion of the Emacs display.

Function: display-graphic-p &optional display

This function returns t if display is a graphic display capable of displaying several frames and several different fonts at once. This is true for displays that use a window system such as X, and false for text terminals.

Function: display-mouse-p &optional display

This function returns t if display has a mouse available, nil if not.

Function: display-color-p &optional display

This function returns t if the screen is a color screen. It used to be called x-display-color-p, and that name is still supported as an alias.

Function: display-grayscale-p &optional display

This function returns t if the screen can display shades of gray. (All color displays can do this.)

Function: display-supports-face-attributes-p attributes &optional display

This function returns non-nil if all the face attributes in attributes are supported (see section Face Attributes).

The definition of ‘supported’ is somewhat heuristic, but basically means that a face containing all the attributes in attributes, when merged with the default face for display, can be represented in a way that’s

  1. different in appearance than the default face, and
  2. ‘close in spirit’ to what the attributes specify, if not exact.

Point (2) implies that a :weight black attribute will be satisfied by any display that can display bold, as will :foreground "yellow" as long as some yellowish color can be displayed, but :slant italic will not be satisfied by the tty display code’s automatic substitution of a ‘dim’ face for italic.

Function: display-selections-p &optional display

This function returns t if display supports selections. Windowed displays normally support selections, but they may also be supported in some other cases.

Function: display-images-p &optional display

This function returns t if display can display images. Windowed displays ought in principle to handle images, but some systems lack the support for that. On a display that does not support images, Emacs cannot display a tool bar.

Function: display-screens &optional display

This function returns the number of screens associated with the display.

Function: display-pixel-height &optional display

This function returns the height of the screen in pixels. On a character terminal, it gives the height in characters.

For graphical terminals, note that on “multi-monitor” setups this refers to the pixel height for all physical monitors associated with display. See section Multiple Terminals.

Function: display-pixel-width &optional display

This function returns the width of the screen in pixels. On a character terminal, it gives the width in characters.

For graphical terminals, note that on “multi-monitor” setups this refers to the pixel width for all physical monitors associated with display. See section Multiple Terminals.

Function: display-mm-height &optional display

This function returns the height of the screen in millimeters, or nil if Emacs cannot get that information.

For graphical terminals, note that on “multi-monitor” setups this refers to the height for all physical monitors associated with display. See section Multiple Terminals.

Function: display-mm-width &optional display

This function returns the width of the screen in millimeters, or nil if Emacs cannot get that information.

For graphical terminals, note that on “multi-monitor” setups this refers to the width for all physical monitors associated with display. See section Multiple Terminals.

User Option: display-mm-dimensions-alist

This variable allows the user to specify the dimensions of graphical displays returned by display-mm-height and display-mm-width in case the system provides incorrect values.

Function: display-backing-store &optional display

This function returns the backing store capability of the display. Backing store means recording the pixels of windows (and parts of windows) that are not exposed, so that when exposed they can be displayed very quickly.

Values can be the symbols always, when-mapped, or not-useful. The function can also return nil when the question is inapplicable to a certain kind of display.

Function: display-save-under &optional display

This function returns non-nil if the display supports the SaveUnder feature. That feature is used by pop-up windows to save the pixels they obscure, so that they can pop down quickly.

Function: display-planes &optional display

This function returns the number of planes the display supports. This is typically the number of bits per pixel. For a tty display, it is log to base two of the number of colors supported.

Function: display-visual-class &optional display

This function returns the visual class for the screen. The value is one of the symbols static-gray (a limited, unchangeable number of grays), gray-scale (a full range of grays), static-color (a limited, unchangeable number of colors), pseudo-color (a limited number of colors), true-color (a full range of colors), and direct-color (a full range of colors).

Function: display-color-cells &optional display

This function returns the number of color cells the screen supports.

These functions obtain additional information about the window system in use where Emacs shows the specified display. (Their names begin with x- for historical reasons.)

Function: x-server-version &optional display

This function returns the list of version numbers of the GUI window system running on display, such as the X server on GNU and Unix systems. The value is a list of three integers: the major and minor version numbers of the protocol, and the distributor-specific release number of the window system software itself. On GNU and Unix systems, these are normally the version of the X protocol and the distributor-specific release number of the X server software. On MS-Windows, this is the version of the Windows OS.

Function: x-server-vendor &optional display

This function returns the “vendor” that provided the window system software (as a string). On GNU and Unix systems this really means whoever distributes the X server. On MS-Windows this is the vendor ID string of the Windows OS (Microsoft).

When the developers of X labeled software distributors as “vendors”, they showed their false assumption that no system could ever be developed and distributed noncommercially.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29 Positions

A position is the index of a character in the text of a buffer. More precisely, a position identifies the place between two characters (or before the first character, or after the last character), so we can speak of the character before or after a given position. However, we often speak of the character “at” a position, meaning the character after that position.

Positions are usually represented as integers starting from 1, but can also be represented as markers—special objects that relocate automatically when text is inserted or deleted so they stay with the surrounding characters. Functions that expect an argument to be a position (an integer), but accept a marker as a substitute, normally ignore which buffer the marker points into; they convert the marker to an integer, and use that integer, exactly as if you had passed the integer as the argument, even if the marker points to the “wrong” buffer. A marker that points nowhere cannot convert to an integer; using it instead of an integer causes an error. See section Markers.

See also the “field” feature (see section Defining and Using Fields), which provides functions that are used by many cursor-motion commands.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.1 Point

Point is a special buffer position used by many editing commands, including the self-inserting typed characters and text insertion functions. Other commands move point through the text to allow editing and insertion at different places.

Like other positions, point designates a place between two characters (or before the first character, or after the last character), rather than a particular character. Usually terminals display the cursor over the character that immediately follows point; point is actually before the character on which the cursor sits.

The value of point is a number no less than 1, and no greater than the buffer size plus 1. If narrowing is in effect (see section Narrowing), then point is constrained to fall within the accessible portion of the buffer (possibly at one end of it).

Each buffer has its own value of point, which is independent of the value of point in other buffers. Each window also has a value of point, which is independent of the value of point in other windows on the same buffer. This is why point can have different values in various windows that display the same buffer. When a buffer appears in only one window, the buffer’s point and the window’s point normally have the same value, so the distinction is rarely important. See section Windows and Point, for more details.

Function: point

This function returns the value of point in the current buffer, as an integer.

(point)
     ⇒ 175
Function: point-min

This function returns the minimum accessible value of point in the current buffer. This is normally 1, but if narrowing is in effect, it is the position of the start of the region that you narrowed to. (See section Narrowing.)

Function: point-max

This function returns the maximum accessible value of point in the current buffer. This is (1+ (buffer-size)), unless narrowing is in effect, in which case it is the position of the end of the region that you narrowed to. (See section Narrowing.)

Function: buffer-end flag

This function returns (point-max) if flag is greater than 0, (point-min) otherwise. The argument flag must be a number.

Function: buffer-size &optional buffer

This function returns the total number of characters in the current buffer. In the absence of any narrowing (see section Narrowing), point-max returns a value one larger than this.

If you specify a buffer, buffer, then the value is the size of buffer.

(buffer-size)
     ⇒ 35
(point-max)
     ⇒ 36

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2 Motion

Motion functions change the value of point, either relative to the current value of point, relative to the beginning or end of the buffer, or relative to the edges of the selected window. See section Point.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.1 Motion by Characters

These functions move point based on a count of characters. goto-char is the fundamental primitive; the other functions use that.

Command: goto-char position

This function sets point in the current buffer to the value position.

If narrowing is in effect, position still counts from the beginning of the buffer, but point cannot go outside the accessible portion. If position is out of range, goto-char moves point to the beginning or the end of the accessible portion.

When this function is called interactively, position is the numeric prefix argument, if provided; otherwise it is read from the minibuffer.

goto-char returns position.

Command: forward-char &optional count

This function moves point count characters forward, towards the end of the buffer (or backward, towards the beginning of the buffer, if count is negative). If count is nil, the default is 1.

If this attempts to move past the beginning or end of the buffer (or the limits of the accessible portion, when narrowing is in effect), it signals an error with error symbol beginning-of-buffer or end-of-buffer.

In an interactive call, count is the numeric prefix argument.

Command: backward-char &optional count

This is just like forward-char except that it moves in the opposite direction.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.2 Motion by Words

These functions for parsing words use the syntax table to decide whether a given character is part of a word. See section Syntax Tables.

Command: forward-word &optional count

This function moves point forward count words (or backward if count is negative). If count is omitted or nil, it defaults to 1.

“Moving one word” means moving until point crosses a word-constituent character and then encounters a word-separator character. However, this function cannot move point past the boundary of the accessible portion of the buffer, or across a field boundary (see section Defining and Using Fields). The most common case of a field boundary is the end of the prompt in the minibuffer.

If it is possible to move count words, without being stopped prematurely by the buffer boundary or a field boundary, the value is t. Otherwise, the return value is nil and point stops at the buffer boundary or field boundary.

If inhibit-field-text-motion is non-nil, this function ignores field boundaries.

In an interactive call, count is specified by the numeric prefix argument.

Command: backward-word &optional count

This function is just like forward-word, except that it moves backward until encountering the front of a word, rather than forward.

User Option: words-include-escapes

This variable affects the behavior of forward-word and everything that uses it. If it is non-nil, then characters in the “escape” and “character quote” syntax classes count as part of words. Otherwise, they do not.

Variable: inhibit-field-text-motion

If this variable is non-nil, certain motion functions including forward-word, forward-sentence, and forward-paragraph ignore field boundaries.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.3 Motion to an End of the Buffer

To move point to the beginning of the buffer, write:

(goto-char (point-min))

Likewise, to move to the end of the buffer, use:

(goto-char (point-max))

Here are two commands that users use to do these things. They are documented here to warn you not to use them in Lisp programs, because they set the mark and display messages in the echo area.

Command: beginning-of-buffer &optional n

This function moves point to the beginning of the buffer (or the limits of the accessible portion, when narrowing is in effect), setting the mark at the previous position (except in Transient Mark mode, if the mark is already active, it does not set the mark.)

If n is non-nil, then it puts point n tenths of the way from the beginning of the accessible portion of the buffer. In an interactive call, n is the numeric prefix argument, if provided; otherwise n defaults to nil.

Warning: Don’t use this function in Lisp programs!

Command: end-of-buffer &optional n

This function moves point to the end of the buffer (or the limits of the accessible portion, when narrowing is in effect), setting the mark at the previous position (except in Transient Mark mode when the mark is already active). If n is non-nil, then it puts point n tenths of the way from the end of the accessible portion of the buffer.

In an interactive call, n is the numeric prefix argument, if provided; otherwise n defaults to nil.

Warning: Don’t use this function in Lisp programs!


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.4 Motion by Text Lines

Text lines are portions of the buffer delimited by newline characters, which are regarded as part of the previous line. The first text line begins at the beginning of the buffer, and the last text line ends at the end of the buffer whether or not the last character is a newline. The division of the buffer into text lines is not affected by the width of the window, by line continuation in display, or by how tabs and control characters are displayed.

Command: beginning-of-line &optional count

This function moves point to the beginning of the current line. With an argument count not nil or 1, it moves forward count-1 lines and then to the beginning of the line.

This function does not move point across a field boundary (see section Defining and Using Fields) unless doing so would move beyond there to a different line; therefore, if count is nil or 1, and point starts at a field boundary, point does not move. To ignore field boundaries, either bind inhibit-field-text-motion to t, or use the forward-line function instead. For instance, (forward-line 0) does the same thing as (beginning-of-line), except that it ignores field boundaries.

If this function reaches the end of the buffer (or of the accessible portion, if narrowing is in effect), it positions point there. No error is signaled.

Function: line-beginning-position &optional count

Return the position that (beginning-of-line count) would move to.

Command: end-of-line &optional count

This function moves point to the end of the current line. With an argument count not nil or 1, it moves forward count-1 lines and then to the end of the line.

This function does not move point across a field boundary (see section Defining and Using Fields) unless doing so would move beyond there to a different line; therefore, if count is nil or 1, and point starts at a field boundary, point does not move. To ignore field boundaries, bind inhibit-field-text-motion to t.

If this function reaches the end of the buffer (or of the accessible portion, if narrowing is in effect), it positions point there. No error is signaled.

Function: line-end-position &optional count

Return the position that (end-of-line count) would move to.

Command: forward-line &optional count

This function moves point forward count lines, to the beginning of the line. If count is negative, it moves point -count lines backward, to the beginning of a line. If count is zero, it moves point to the beginning of the current line. If count is nil, that means 1.

If forward-line encounters the beginning or end of the buffer (or of the accessible portion) before finding that many lines, it sets point there. No error is signaled.

forward-line returns the difference between count and the number of lines actually moved. If you attempt to move down five lines from the beginning of a buffer that has only three lines, point stops at the end of the last line, and the value will be 2.

In an interactive call, count is the numeric prefix argument.

Function: count-lines start end

This function returns the number of lines between the positions start and end in the current buffer. If start and end are equal, then it returns 0. Otherwise it returns at least 1, even if start and end are on the same line. This is because the text between them, considered in isolation, must contain at least one line unless it is empty.

Command: count-words start end

This function returns the number of words between the positions start and end in the current buffer.

This function can also be called interactively. In that case, it prints a message reporting the number of lines, words, and characters in the buffer, or in the region if the region is active.

Function: line-number-at-pos &optional pos

This function returns the line number in the current buffer corresponding to the buffer position pos. If pos is nil or omitted, the current buffer position is used.

Also see the functions bolp and eolp in Examining Text Near Point. These functions do not move point, but test whether it is already at the beginning or end of a line.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.5 Motion by Screen Lines

The line functions in the previous section count text lines, delimited only by newline characters. By contrast, these functions count screen lines, which are defined by the way the text appears on the screen. A text line is a single screen line if it is short enough to fit the width of the selected window, but otherwise it may occupy several screen lines.

In some cases, text lines are truncated on the screen rather than continued onto additional screen lines. In these cases, vertical-motion moves point much like forward-line. See section Truncation.

Because the width of a given string depends on the flags that control the appearance of certain characters, vertical-motion behaves differently, for a given piece of text, depending on the buffer it is in, and even on the selected window (because the width, the truncation flag, and display table may vary between windows). See section Usual Display Conventions.

These functions scan text to determine where screen lines break, and thus take time proportional to the distance scanned.

Function: vertical-motion count &optional window

This function moves point to the start of the screen line count screen lines down from the screen line containing point. If count is negative, it moves up instead.

The count argument can be a cons cell, (cols . lines), instead of an integer. Then the function moves by lines screen lines, and puts point cols columns from the visual start of that screen line. Note that cols are counted from the visual start of the line; if the window is scrolled horizontally (see section Horizontal Scrolling), the column on which point will end is in addition to the number of columns by which the text is scrolled.

The return value is the number of screen lines over which point was moved. The value may be less in absolute value than count if the beginning or end of the buffer was reached.

The window window is used for obtaining parameters such as the width, the horizontal scrolling, and the display table. But vertical-motion always operates on the current buffer, even if window currently displays some other buffer.

Function: count-screen-lines &optional beg end count-final-newline window

This function returns the number of screen lines in the text from beg to end. The number of screen lines may be different from the number of actual lines, due to line continuation, the display table, etc. If beg and end are nil or omitted, they default to the beginning and end of the accessible portion of the buffer.

If the region ends with a newline, that is ignored unless the optional third argument count-final-newline is non-nil.

The optional fourth argument window specifies the window for obtaining parameters such as width, horizontal scrolling, and so on. The default is to use the selected window’s parameters.

Like vertical-motion, count-screen-lines always uses the current buffer, regardless of which buffer is displayed in window. This makes possible to use count-screen-lines in any buffer, whether or not it is currently displayed in some window.

Command: move-to-window-line count

This function moves point with respect to the text currently displayed in the selected window. It moves point to the beginning of the screen line count screen lines from the top of the window. If count is negative, that specifies a position -count lines from the bottom (or the last line of the buffer, if the buffer ends above the specified screen position).

If count is nil, then point moves to the beginning of the line in the middle of the window. If the absolute value of count is greater than the size of the window, then point moves to the place that would appear on that screen line if the window were tall enough. This will probably cause the next redisplay to scroll to bring that location onto the screen.

In an interactive call, count is the numeric prefix argument.

The value returned is the window line number point has moved to, with the top line in the window numbered 0.

Function: compute-motion from frompos to topos width offsets window

This function scans the current buffer, calculating screen positions. It scans the buffer forward from position from, assuming that is at screen coordinates frompos, to position to or coordinates topos, whichever comes first. It returns the ending buffer position and screen coordinates.

The coordinate arguments frompos and topos are cons cells of the form (hpos . vpos).

The argument width is the number of columns available to display text; this affects handling of continuation lines. nil means the actual number of usable text columns in the window, which is equivalent to the value returned by (window-width window).

The argument offsets is either nil or a cons cell of the form (hscroll . tab-offset). Here hscroll is the number of columns not being displayed at the left margin; most callers get this by calling window-hscroll. Meanwhile, tab-offset is the offset between column numbers on the screen and column numbers in the buffer. This can be nonzero in a continuation line, when the previous screen lines’ widths do not add up to a multiple of tab-width. It is always zero in a non-continuation line.

The window window serves only to specify which display table to use. compute-motion always operates on the current buffer, regardless of what buffer is displayed in window.

The return value is a list of five elements:

(pos hpos vpos prevhpos contin)

Here pos is the buffer position where the scan stopped, vpos is the vertical screen position, and hpos is the horizontal screen position.

The result prevhpos is the horizontal position one character back from pos. The result contin is t if the last line was continued after (or within) the previous character.

For example, to find the buffer position of column col of screen line line of a certain window, pass the window’s display start location as from and the window’s upper-left coordinates as frompos. Pass the buffer’s (point-max) as to, to limit the scan to the end of the accessible portion of the buffer, and pass line and col as topos. Here’s a function that does this:

(defun coordinates-of-position (col line)
  (car (compute-motion (window-start)
                       '(0 . 0)
                       (point-max)
                       (cons col line)
                       (window-width)
                       (cons (window-hscroll) 0)
                       (selected-window))))

When you use compute-motion for the minibuffer, you need to use minibuffer-prompt-width to get the horizontal position of the beginning of the first screen line. See section Minibuffer Contents.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.6 Moving over Balanced Expressions

Here are several functions concerned with balanced-parenthesis expressions (also called sexps in connection with moving across them in Emacs). The syntax table controls how these functions interpret various characters; see Syntax Tables. See section Parsing Expressions, for lower-level primitives for scanning sexps or parts of sexps. For user-level commands, see Commands for Editing with Parentheses in The GNU Emacs Manual.

Command: forward-list &optional arg

This function moves forward across arg (default 1) balanced groups of parentheses. (Other syntactic entities such as words or paired string quotes are ignored.)

Command: backward-list &optional arg

This function moves backward across arg (default 1) balanced groups of parentheses. (Other syntactic entities such as words or paired string quotes are ignored.)

Command: up-list &optional arg

This function moves forward out of arg (default 1) levels of parentheses. A negative argument means move backward but still to a less deep spot.

Command: down-list &optional arg

This function moves forward into arg (default 1) levels of parentheses. A negative argument means move backward but still go deeper in parentheses (-arg levels).

Command: forward-sexp &optional arg

This function moves forward across arg (default 1) balanced expressions. Balanced expressions include both those delimited by parentheses and other kinds, such as words and string constants. See section Parsing Expressions. For example,

---------- Buffer: foo ----------
(concat∗ "foo " (car x) y z)
---------- Buffer: foo ----------
(forward-sexp 3)
     ⇒ nil

---------- Buffer: foo ----------
(concat "foo " (car x) y∗ z)
---------- Buffer: foo ----------
Command: backward-sexp &optional arg

This function moves backward across arg (default 1) balanced expressions.

Command: beginning-of-defun &optional arg

This function moves back to the argth beginning of a defun. If arg is negative, this actually moves forward, but it still moves to the beginning of a defun, not to the end of one. arg defaults to 1.

Command: end-of-defun &optional arg

This function moves forward to the argth end of a defun. If arg is negative, this actually moves backward, but it still moves to the end of a defun, not to the beginning of one. arg defaults to 1.

User Option: defun-prompt-regexp

If non-nil, this buffer-local variable holds a regular expression that specifies what text can appear before the open-parenthesis that starts a defun. That is to say, a defun begins on a line that starts with a match for this regular expression, followed by a character with open-parenthesis syntax.

User Option: open-paren-in-column-0-is-defun-start

If this variable’s value is non-nil, an open parenthesis in column 0 is considered to be the start of a defun. If it is nil, an open parenthesis in column 0 has no special meaning. The default is t.

Variable: beginning-of-defun-function

If non-nil, this variable holds a function for finding the beginning of a defun. The function beginning-of-defun calls this function instead of using its normal method, passing it its optional argument. If the argument is non-nil, the function should move back by that many functions, like beginning-of-defun does.

Variable: end-of-defun-function

If non-nil, this variable holds a function for finding the end of a defun. The function end-of-defun calls this function instead of using its normal method.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.7 Skipping Characters

The following two functions move point over a specified set of characters. For example, they are often used to skip whitespace. For related functions, see Motion and Syntax.

These functions convert the set string to multibyte if the buffer is multibyte, and they convert it to unibyte if the buffer is unibyte, as the search functions do (see section Searching and Matching).

Function: skip-chars-forward character-set &optional limit

This function moves point in the current buffer forward, skipping over a given set of characters. It examines the character following point, then advances point if the character matches character-set. This continues until it reaches a character that does not match. The function returns the number of characters moved over.

The argument character-set is a string, like the inside of a ‘[…]’ in a regular expression except that ‘]’ does not terminate it, and ‘\’ quotes ‘^’, ‘-’ or ‘\’. Thus, "a-zA-Z" skips over all letters, stopping before the first nonletter, and "^a-zA-Z" skips nonletters stopping before the first letter. See See section Regular Expressions. Character classes can also be used, e.g., "[:alnum:]". See see section Character Classes.

If limit is supplied (it must be a number or a marker), it specifies the maximum position in the buffer that point can be skipped to. Point will stop at or before limit.

In the following example, point is initially located directly before the ‘T’. After the form is evaluated, point is located at the end of that line (between the ‘t’ of ‘hat’ and the newline). The function skips all letters and spaces, but not newlines.

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------
(skip-chars-forward "a-zA-Z ")
     ⇒ 18

---------- Buffer: foo ----------
I read "The cat in the hat∗
comes back" twice.
---------- Buffer: foo ----------
Function: skip-chars-backward character-set &optional limit

This function moves point backward, skipping characters that match character-set, until limit. It is just like skip-chars-forward except for the direction of motion.

The return value indicates the distance traveled. It is an integer that is zero or less.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.3 Excursions

It is often useful to move point “temporarily” within a localized portion of the program. This is called an excursion, and it is done with the save-excursion special form. This construct remembers the initial identity of the current buffer, and its values of point and the mark, and restores them after the excursion completes. It is the standard way to move point within one part of a program and avoid affecting the rest of the program, and is used thousands of times in the Lisp sources of Emacs.

If you only need to save and restore the identity of the current buffer, use save-current-buffer or with-current-buffer instead (see section The Current Buffer). If you need to save or restore window configurations, see the forms described in Window Configurations and in Frame Configurations.

Special Form: save-excursion body…

This special form saves the identity of the current buffer and the values of point and the mark in it, evaluates body, and finally restores the buffer and its saved values of point and the mark. All three saved values are restored even in case of an abnormal exit via throw or error (see section Nonlocal Exits).

The value returned by save-excursion is the result of the last form in body, or nil if no body forms were given.

Because save-excursion only saves point and mark for the buffer that was current at the start of the excursion, any changes made to point and/or mark in other buffers, during the excursion, will remain in effect afterward. This frequently leads to unintended consequences, so the byte compiler warns if you call set-buffer during an excursion:

Warning: Use `with-current-buffer' rather than
         save-excursion+set-buffer

To avoid such problems, you should call save-excursion only after setting the desired current buffer, as in the following example:

(defun append-string-to-buffer (string buffer)
  "Append STRING to the end of BUFFER."
  (with-current-buffer buffer
    (save-excursion
      (goto-char (point-max))
      (insert string))))

Likewise, save-excursion does not restore window-buffer correspondences altered by functions such as switch-to-buffer.

Warning: Ordinary insertion of text adjacent to the saved point value relocates the saved value, just as it relocates all markers. More precisely, the saved value is a marker with insertion type nil. See section Marker Insertion Types. Therefore, when the saved point value is restored, it normally comes before the inserted text.

Although save-excursion saves the location of the mark, it does not prevent functions which modify the buffer from setting deactivate-mark, and thus causing the deactivation of the mark after the command finishes. See section The Mark.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.4 Narrowing

Narrowing means limiting the text addressable by Emacs editing commands to a limited range of characters in a buffer. The text that remains addressable is called the accessible portion of the buffer.

Narrowing is specified with two buffer positions, which become the beginning and end of the accessible portion. For most editing commands and primitives, these positions replace the values of the beginning and end of the buffer. While narrowing is in effect, no text outside the accessible portion is displayed, and point cannot move outside the accessible portion. Note that narrowing does not alter actual buffer positions (see section Point); it only determines which positions are considered the accessible portion of the buffer. Most functions refuse to operate on text that is outside the accessible portion.

Commands for saving buffers are unaffected by narrowing; they save the entire buffer regardless of any narrowing.

If you need to display in a single buffer several very different types of text, consider using an alternative facility described in Swapping Text Between Two Buffers.

Command: narrow-to-region start end

This function sets the accessible portion of the current buffer to start at start and end at end. Both arguments should be character positions.

In an interactive call, start and end are set to the bounds of the current region (point and the mark, with the smallest first).

Command: narrow-to-page &optional move-count

This function sets the accessible portion of the current buffer to include just the current page. An optional first argument move-count non-nil means to move forward or backward by move-count pages and then narrow to one page. The variable page-delimiter specifies where pages start and end (see section Standard Regular Expressions Used in Editing).

In an interactive call, move-count is set to the numeric prefix argument.

Command: widen

This function cancels any narrowing in the current buffer, so that the entire contents are accessible. This is called widening. It is equivalent to the following expression:

(narrow-to-region 1 (1+ (buffer-size)))
Function: buffer-narrowed-p

This function returns non-nil if the buffer is narrowed, and nil otherwise.

Special Form: save-restriction body…

This special form saves the current bounds of the accessible portion, evaluates the body forms, and finally restores the saved bounds, thus restoring the same state of narrowing (or absence thereof) formerly in effect. The state of narrowing is restored even in the event of an abnormal exit via throw or error (see section Nonlocal Exits). Therefore, this construct is a clean way to narrow a buffer temporarily.

The value returned by save-restriction is that returned by the last form in body, or nil if no body forms were given.

Caution: it is easy to make a mistake when using the save-restriction construct. Read the entire description here before you try it.

If body changes the current buffer, save-restriction still restores the restrictions on the original buffer (the buffer whose restrictions it saved from), but it does not restore the identity of the current buffer.

save-restriction does not restore point and the mark; use save-excursion for that. If you use both save-restriction and save-excursion together, save-excursion should come first (on the outside). Otherwise, the old point value would be restored with temporary narrowing still in effect. If the old point value were outside the limits of the temporary narrowing, this would fail to restore it accurately.

Here is a simple example of correct use of save-restriction:

---------- Buffer: foo ----------
This is the contents of foo
This is the contents of foo
This is the contents of foo∗
---------- Buffer: foo ----------
(save-excursion
  (save-restriction
    (goto-char 1)
    (forward-line 2)
    (narrow-to-region 1 (point))
    (goto-char (point-min))
    (replace-string "foo" "bar")))

---------- Buffer: foo ----------
This is the contents of bar
This is the contents of bar
This is the contents of foo∗
---------- Buffer: foo ----------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30 Markers

A marker is a Lisp object used to specify a position in a buffer relative to the surrounding text. A marker changes its offset from the beginning of the buffer automatically whenever text is inserted or deleted, so that it stays with the two characters on either side of it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.1 Overview of Markers

A marker specifies a buffer and a position in that buffer. A marker can be used to represent a position in functions that require one, just as an integer could be used. In that case, the marker’s buffer is normally ignored. Of course, a marker used in this way usually points to a position in the buffer that the function operates on, but that is entirely the programmer’s responsibility. See section Positions, for a complete description of positions.

A marker has three attributes: the marker position, the marker buffer, and the insertion type. The marker position is an integer that is equivalent (at a given time) to the marker as a position in that buffer. But the marker’s position value can change during the life of the marker, and often does. Insertion and deletion of text in the buffer relocate the marker. The idea is that a marker positioned between two characters remains between those two characters despite insertion and deletion elsewhere in the buffer. Relocation changes the integer equivalent of the marker.

Deleting text around a marker’s position leaves the marker between the characters immediately before and after the deleted text. Inserting text at the position of a marker normally leaves the marker either in front of or after the new text, depending on the marker’s insertion type (see section Marker Insertion Types)—unless the insertion is done with insert-before-markers (see section Inserting Text).

Insertion and deletion in a buffer must check all the markers and relocate them if necessary. This slows processing in a buffer with a large number of markers. For this reason, it is a good idea to make a marker point nowhere if you are sure you don’t need it any more. Markers that can no longer be accessed are eventually removed (see section Garbage Collection).

Because it is common to perform arithmetic operations on a marker position, most of these operations (including + and -) accept markers as arguments. In such cases, the marker stands for its current position.

Here are examples of creating markers, setting markers, and moving point to markers:

;; Make a new marker that initially does not point anywhere:
(setq m1 (make-marker))
     ⇒ #<marker in no buffer>
;; Set m1 to point between the 99th and 100th characters
;;   in the current buffer:
(set-marker m1 100)
     ⇒ #<marker at 100 in markers.texi>
;; Now insert one character at the beginning of the buffer:
(goto-char (point-min))
     ⇒ 1
(insert "Q")
     ⇒ nil
;; m1 is updated appropriately.
m1
     ⇒ #<marker at 101 in markers.texi>
;; Two markers that point to the same position
;;   are not eq, but they are equal.
(setq m2 (copy-marker m1))
     ⇒ #<marker at 101 in markers.texi>
(eq m1 m2)
     ⇒ nil
(equal m1 m2)
     ⇒ t
;; When you are finished using a marker, make it point nowhere.
(set-marker m1 nil)
     ⇒ #<marker in no buffer>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.2 Predicates on Markers

You can test an object to see whether it is a marker, or whether it is either an integer or a marker. The latter test is useful in connection with the arithmetic functions that work with both markers and integers.

Function: markerp object

This function returns t if object is a marker, nil otherwise. Note that integers are not markers, even though many functions will accept either a marker or an integer.

Function: integer-or-marker-p object

This function returns t if object is an integer or a marker, nil otherwise.

Function: number-or-marker-p object

This function returns t if object is a number (either integer or floating point) or a marker, nil otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.3 Functions that Create Markers

When you create a new marker, you can make it point nowhere, or point to the present position of point, or to the beginning or end of the accessible portion of the buffer, or to the same place as another given marker.

The next four functions all return markers with insertion type nil. See section Marker Insertion Types.

Function: make-marker

This function returns a newly created marker that does not point anywhere.

(make-marker)
     ⇒ #<marker in no buffer>
Function: point-marker

This function returns a new marker that points to the present position of point in the current buffer. See section Point. For an example, see copy-marker, below.

Function: point-min-marker

This function returns a new marker that points to the beginning of the accessible portion of the buffer. This will be the beginning of the buffer unless narrowing is in effect. See section Narrowing.

Function: point-max-marker

This function returns a new marker that points to the end of the accessible portion of the buffer. This will be the end of the buffer unless narrowing is in effect. See section Narrowing.

Here are examples of this function and point-min-marker, shown in a buffer containing a version of the source file for the text of this chapter.

(point-min-marker)
     ⇒ #<marker at 1 in markers.texi>
(point-max-marker)
     ⇒ #<marker at 24080 in markers.texi>
(narrow-to-region 100 200)
     ⇒ nil
(point-min-marker)
     ⇒ #<marker at 100 in markers.texi>
(point-max-marker)
     ⇒ #<marker at 200 in markers.texi>
Function: copy-marker &optional marker-or-integer insertion-type

If passed a marker as its argument, copy-marker returns a new marker that points to the same place and the same buffer as does marker-or-integer. If passed an integer as its argument, copy-marker returns a new marker that points to position marker-or-integer in the current buffer.

The new marker’s insertion type is specified by the argument insertion-type. See section Marker Insertion Types.

(copy-marker 0)
     ⇒ #<marker at 1 in markers.texi>
(copy-marker 90000)
     ⇒ #<marker at 24080 in markers.texi>

An error is signaled if marker is neither a marker nor an integer.

Two distinct markers are considered equal (even though not eq) to each other if they have the same position and buffer, or if they both point nowhere.

(setq p (point-marker))
     ⇒ #<marker at 2139 in markers.texi>
(setq q (copy-marker p))
     ⇒ #<marker at 2139 in markers.texi>
(eq p q)
     ⇒ nil
(equal p q)
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.4 Information from Markers

This section describes the functions for accessing the components of a marker object.

Function: marker-position marker

This function returns the position that marker points to, or nil if it points nowhere.

Function: marker-buffer marker

This function returns the buffer that marker points into, or nil if it points nowhere.

(setq m (make-marker))
     ⇒ #<marker in no buffer>
(marker-position m)
     ⇒ nil
(marker-buffer m)
     ⇒ nil
(set-marker m 3770 (current-buffer))
     ⇒ #<marker at 3770 in markers.texi>
(marker-buffer m)
     ⇒ #<buffer markers.texi>
(marker-position m)
     ⇒ 3770

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.5 Marker Insertion Types

When you insert text directly at the place where a marker points, there are two possible ways to relocate that marker: it can point before the inserted text, or point after it. You can specify which one a given marker should do by setting its insertion type. Note that use of insert-before-markers ignores markers’ insertion types, always relocating a marker to point after the inserted text.

Function: set-marker-insertion-type marker type

This function sets the insertion type of marker marker to type. If type is t, marker will advance when text is inserted at its position. If type is nil, marker does not advance when text is inserted there.

Function: marker-insertion-type marker

This function reports the current insertion type of marker.

Most functions that create markers, without an argument allowing to specify the insertion type, create them with insertion type nil. Also, the mark has, by default, insertion type nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.6 Moving Marker Positions

This section describes how to change the position of an existing marker. When you do this, be sure you know whether the marker is used outside of your program, and, if so, what effects will result from moving it—otherwise, confusing things may happen in other parts of Emacs.

Function: set-marker marker position &optional buffer

This function moves marker to position in buffer. If buffer is not provided, it defaults to the current buffer.

If position is nil or a marker that points nowhere, then marker is set to point nowhere.

The value returned is marker.

(setq m (point-marker))
     ⇒ #<marker at 4714 in markers.texi>
(set-marker m 55)
     ⇒ #<marker at 55 in markers.texi>
(setq b (get-buffer "foo"))
     ⇒ #<buffer foo>
(set-marker m 0 b)
     ⇒ #<marker at 1 in foo>
Function: move-marker marker position &optional buffer

This is another name for set-marker.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.7 The Mark

Each buffer has a special marker, which is designated the mark. When a buffer is newly created, this marker exists but does not point anywhere; this means that the mark “doesn’t exist” in that buffer yet. Subsequent commands can set the mark.

The mark specifies a position to bound a range of text for many commands, such as kill-region and indent-rigidly. These commands typically act on the text between point and the mark, which is called the region. If you are writing a command that operates on the region, don’t examine the mark directly; instead, use interactive with the ‘r’ specification. This provides the values of point and the mark as arguments to the command in an interactive call, but permits other Lisp programs to specify arguments explicitly. See section Code Characters for interactive.

Some commands set the mark as a side-effect. Commands should do this only if it has a potential use to the user, and never for their own internal purposes. For example, the replace-regexp command sets the mark to the value of point before doing any replacements, because this enables the user to move back there conveniently after the replace is finished.

Once the mark “exists” in a buffer, it normally never ceases to exist. However, it may become inactive, if Transient Mark mode is enabled. The buffer-local variable mark-active, if non-nil, means that the mark is active. A command can call the function deactivate-mark to deactivate the mark directly, or it can request deactivation of the mark upon return to the editor command loop by setting the variable deactivate-mark to a non-nil value.

If Transient Mark mode is enabled, certain editing commands that normally apply to text near point, apply instead to the region when the mark is active. This is the main motivation for using Transient Mark mode. (Another is that this enables highlighting of the region when the mark is active. See section Emacs Display.)

In addition to the mark, each buffer has a mark ring which is a list of markers containing previous values of the mark. When editing commands change the mark, they should normally save the old value of the mark on the mark ring. The variable mark-ring-max specifies the maximum number of entries in the mark ring; once the list becomes this long, adding a new element deletes the last element.

There is also a separate global mark ring, but that is used only in a few particular user-level commands, and is not relevant to Lisp programming. So we do not describe it here.

Function: mark &optional force

This function returns the current buffer’s mark position as an integer, or nil if no mark has ever been set in this buffer.

If Transient Mark mode is enabled, and mark-even-if-inactive is nil, mark signals an error if the mark is inactive. However, if force is non-nil, then mark disregards inactivity of the mark, and returns the mark position (or nil) anyway.

Function: mark-marker

This function returns the marker that represents the current buffer’s mark. It is not a copy, it is the marker used internally. Therefore, changing this marker’s position will directly affect the buffer’s mark. Don’t do that unless that is the effect you want.

(setq m (mark-marker))
     ⇒ #<marker at 3420 in markers.texi>
(set-marker m 100)
     ⇒ #<marker at 100 in markers.texi>
(mark-marker)
     ⇒ #<marker at 100 in markers.texi>

Like any marker, this marker can be set to point at any buffer you like. If you make it point at any buffer other than the one of which it is the mark, it will yield perfectly consistent, but rather odd, results. We recommend that you not do it!

Function: set-mark position

This function sets the mark to position, and activates the mark. The old value of the mark is not pushed onto the mark ring.

Please note: Use this function only if you want the user to see that the mark has moved, and you want the previous mark position to be lost. Normally, when a new mark is set, the old one should go on the mark-ring. For this reason, most applications should use push-mark and pop-mark, not set-mark.

Novice Emacs Lisp programmers often try to use the mark for the wrong purposes. The mark saves a location for the user’s convenience. An editing command should not alter the mark unless altering the mark is part of the user-level functionality of the command. (And, in that case, this effect should be documented.) To remember a location for internal use in the Lisp program, store it in a Lisp variable. For example:

(let ((beg (point)))
  (forward-line 1)
  (delete-region beg (point))).
Function: push-mark &optional position nomsg activate

This function sets the current buffer’s mark to position, and pushes a copy of the previous mark onto mark-ring. If position is nil, then the value of point is used.

The function push-mark normally does not activate the mark. To do that, specify t for the argument activate.

A ‘Mark set’ message is displayed unless nomsg is non-nil.

Function: pop-mark

This function pops off the top element of mark-ring and makes that mark become the buffer’s actual mark. This does not move point in the buffer, and it does nothing if mark-ring is empty. It deactivates the mark.

User Option: transient-mark-mode

This variable, if non-nil, enables Transient Mark mode. In Transient Mark mode, every buffer-modifying primitive sets deactivate-mark. As a consequence, most commands that modify the buffer also deactivate the mark.

When Transient Mark mode is enabled and the mark is active, many commands that normally apply to the text near point instead apply to the region. Such commands should use the function use-region-p to test whether they should operate on the region. See section The Region.

Lisp programs can set transient-mark-mode to non-nil, non-t values to enable Transient Mark mode temporarily. If the value is lambda, Transient Mark mode is automatically turned off after any action, such as buffer modification, that would normally deactivate the mark. If the value is (only . oldval), then transient-mark-mode is set to the value oldval after any subsequent command that moves point and is not shift-translated (see section shift-translation), or after any other action that would normally deactivate the mark.

User Option: mark-even-if-inactive

If this is non-nil, Lisp programs and the Emacs user can use the mark even when it is inactive. This option affects the behavior of Transient Mark mode. When the option is non-nil, deactivation of the mark turns off region highlighting, but commands that use the mark behave as if the mark were still active.

Variable: deactivate-mark

If an editor command sets this variable non-nil, then the editor command loop deactivates the mark after the command returns (if Transient Mark mode is enabled). All the primitives that change the buffer set deactivate-mark, to deactivate the mark when the command is finished.

To write Lisp code that modifies the buffer without causing deactivation of the mark at the end of the command, bind deactivate-mark to nil around the code that does the modification. For example:

(let (deactivate-mark)
  (insert " "))
Function: deactivate-mark &optional force

If Transient Mark mode is enabled or force is non-nil, this function deactivates the mark and runs the normal hook deactivate-mark-hook. Otherwise, it does nothing.

Variable: mark-active

The mark is active when this variable is non-nil. This variable is always buffer-local in each buffer. Do not use the value of this variable to decide whether a command that normally operates on text near point should operate on the region instead. Use the function use-region-p for that (see section The Region).

Variable: activate-mark-hook
Variable: deactivate-mark-hook

These normal hooks are run, respectively, when the mark becomes active and when it becomes inactive. The hook activate-mark-hook is also run at the end of the command loop if the mark is active and it is possible that the region may have changed.

Function: handle-shift-selection

This function implements the “shift-selection” behavior of point-motion commands. See Shift Selection in The GNU Emacs Manual. It is called automatically by the Emacs command loop whenever a command with a ‘^’ character in its interactive spec is invoked, before the command itself is executed (see section ^).

If shift-select-mode is non-nil and the current command was invoked via shift translation (see section shift-translation), this function sets the mark and temporarily activates the region, unless the region was already temporarily activated in this way. Otherwise, if the region has been activated temporarily, it deactivates the mark and restores the variable transient-mark-mode to its earlier value.

Variable: mark-ring

The value of this buffer-local variable is the list of saved former marks of the current buffer, most recent first.

mark-ring
⇒ (#<marker at 11050 in markers.texi>
    #<marker at 10832 in markers.texi>
    …)
User Option: mark-ring-max

The value of this variable is the maximum size of mark-ring. If more marks than this are pushed onto the mark-ring, push-mark discards an old mark when it adds a new one.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.8 The Region

The text between point and the mark is known as the region. Various functions operate on text delimited by point and the mark, but only those functions specifically related to the region itself are described here.

The next two functions signal an error if the mark does not point anywhere. If Transient Mark mode is enabled and mark-even-if-inactive is nil, they also signal an error if the mark is inactive.

Function: region-beginning

This function returns the position of the beginning of the region (as an integer). This is the position of either point or the mark, whichever is smaller.

Function: region-end

This function returns the position of the end of the region (as an integer). This is the position of either point or the mark, whichever is larger.

Instead of using region-beginning and region-end, a command designed to operate on a region should normally use interactive with the ‘r’ specification to find the beginning and end of the region. This lets other Lisp programs specify the bounds explicitly as arguments. See section Code Characters for interactive.

Function: use-region-p

This function returns t if Transient Mark mode is enabled, the mark is active, and there is a valid region in the buffer. This function is intended to be used by commands that operate on the region, instead of on text near point, when the mark is active.

A region is valid if it has a non-zero size, or if the user option use-empty-active-region is non-nil (by default, it is nil). The function region-active-p is similar to use-region-p, but considers all regions as valid. In most cases, you should not use region-active-p, since if the region is empty it is often more appropriate to operate on point.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31 Text

This chapter describes the functions that deal with the text in a buffer. Most examine, insert, or delete text in the current buffer, often operating at point or on text adjacent to point. Many are interactive. All the functions that change the text provide for undoing the changes (see section Undo).

Many text-related functions operate on a region of text defined by two buffer positions passed in arguments named start and end. These arguments should be either markers (see section Markers) or numeric character positions (see section Positions). The order of these arguments does not matter; it is all right for start to be the end of the region and end the beginning. For example, (delete-region 1 10) and (delete-region 10 1) are equivalent. An args-out-of-range error is signaled if either start or end is outside the accessible portion of the buffer. In an interactive call, point and the mark are used for these arguments.

Throughout this chapter, “text” refers to the characters in the buffer, together with their properties (when relevant). Keep in mind that point is always between two characters, and the cursor appears on the character after point.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.1 Examining Text Near Point

Many functions are provided to look at the characters around point. Several simple functions are described here. See also looking-at in Regular Expression Searching.

In the following four functions, “beginning” or “end” of buffer refers to the beginning or end of the accessible portion.

Function: char-after &optional position

This function returns the character in the current buffer at (i.e., immediately after) position position. If position is out of range for this purpose, either before the beginning of the buffer, or at or beyond the end, then the value is nil. The default for position is point.

In the following example, assume that the first character in the buffer is ‘@’:

(string (char-after 1))
     ⇒ "@"
Function: char-before &optional position

This function returns the character in the current buffer immediately before position position. If position is out of range for this purpose, either at or before the beginning of the buffer, or beyond the end, then the value is nil. The default for position is point.

Function: following-char

This function returns the character following point in the current buffer. This is similar to (char-after (point)). However, if point is at the end of the buffer, then following-char returns 0.

Remember that point is always between characters, and the cursor normally appears over the character following point. Therefore, the character returned by following-char is the character the cursor is over.

In this example, point is between the ‘a’ and the ‘c’.

---------- Buffer: foo ----------
Gentlemen may cry ``Pea∗ce! Peace!,''
but there is no peace.
---------- Buffer: foo ----------
(string (preceding-char))
     ⇒ "a"
(string (following-char))
     ⇒ "c"
Function: preceding-char

This function returns the character preceding point in the current buffer. See above, under following-char, for an example. If point is at the beginning of the buffer, preceding-char returns 0.

Function: bobp

This function returns t if point is at the beginning of the buffer. If narrowing is in effect, this means the beginning of the accessible portion of the text. See also point-min in Point.

Function: eobp

This function returns t if point is at the end of the buffer. If narrowing is in effect, this means the end of accessible portion of the text. See also point-max in See section Point.

Function: bolp

This function returns t if point is at the beginning of a line. See section Motion by Text Lines. The beginning of the buffer (or of its accessible portion) always counts as the beginning of a line.

Function: eolp

This function returns t if point is at the end of a line. The end of the buffer (or of its accessible portion) is always considered the end of a line.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.2 Examining Buffer Contents

This section describes functions that allow a Lisp program to convert any portion of the text in the buffer into a string.

Function: buffer-substring start end

This function returns a string containing a copy of the text of the region defined by positions start and end in the current buffer. If the arguments are not positions in the accessible portion of the buffer, buffer-substring signals an args-out-of-range error.

Here’s an example which assumes Font-Lock mode is not enabled:

---------- Buffer: foo ----------
This is the contents of buffer foo

---------- Buffer: foo ----------
(buffer-substring 1 10)
     ⇒ "This is t"
(buffer-substring (point-max) 10)
     ⇒ "he contents of buffer foo\n"

If the text being copied has any text properties, these are copied into the string along with the characters they belong to. See section Text Properties. However, overlays (see section Overlays) in the buffer and their properties are ignored, not copied.

For example, if Font-Lock mode is enabled, you might get results like these:

(buffer-substring 1 10)
     ⇒ #("This is t" 0 1 (fontified t) 1 9 (fontified t))
Function: buffer-substring-no-properties start end

This is like buffer-substring, except that it does not copy text properties, just the characters themselves. See section Text Properties.

Function: buffer-string

This function returns the contents of the entire accessible portion of the current buffer, as a string.

Function: filter-buffer-substring start end &optional delete

This function filters the buffer text between start and end using a function specified by the variable filter-buffer-substring-function, and returns the result.

The default filter function consults the obsolete wrapper hook filter-buffer-substring-functions, and the obsolete variable buffer-substring-filters. If both of these are nil, it returns the unaltered text from the buffer, i.e., what buffer-substring would return.

If delete is non-nil, the function deletes the text between start and end after copying it, like delete-and-extract-region.

Lisp code should use this function instead of buffer-substring, buffer-substring-no-properties, or delete-and-extract-region when copying into user-accessible data structures such as the kill-ring, X clipboard, and registers. Major and minor modes can modify filter-buffer-substring-function to alter such text as it is copied out of the buffer.

Variable: filter-buffer-substring-function

The value of this variable is a function that filter-buffer-substring will call to do the actual work. The function receives three arguments, the same as those of filter-buffer-substring, which it should treat as per the documentation of that function. It should return the filtered text (and optionally delete the source text).

The following two variables are obsoleted by filter-buffer-substring-function, but are still supported for backward compatibility.

Variable: filter-buffer-substring-functions

This obsolete variable is a wrapper hook, whose members should be functions that accept four arguments: fun, start, end, and delete. fun is a function that takes three arguments (start, end, and delete), and returns a string. In both cases, the start, end, and delete arguments are the same as those of filter-buffer-substring.

The first hook function is passed a fun that is equivalent to the default operation of filter-buffer-substring, i.e., it returns the buffer-substring between start and end (processed by any buffer-substring-filters) and optionally deletes the original text from the buffer. In most cases, the hook function will call fun once, and then do its own processing of the result. The next hook function receives a fun equivalent to this, and so on. The actual return value is the result of all the hook functions acting in sequence.

Variable: buffer-substring-filters

The value of this obsolete variable should be a list of functions that accept a single string argument and return another string. The default filter-buffer-substring function passes the buffer substring to the first function in this list, and the return value of each function is passed to the next function. The return value of the last function is passed to filter-buffer-substring-functions.

Function: current-word &optional strict really-word

This function returns the symbol (or word) at or near point, as a string. The return value includes no text properties.

If the optional argument really-word is non-nil, it finds a word; otherwise, it finds a symbol (which includes both word characters and symbol constituent characters).

If the optional argument strict is non-nil, then point must be in or next to the symbol or word—if no symbol or word is there, the function returns nil. Otherwise, a nearby symbol or word on the same line is acceptable.

Function: thing-at-point thing

Return the thing around or next to point, as a string.

The argument thing is a symbol which specifies a kind of syntactic entity. Possibilities include symbol, list, sexp, defun, filename, url, word, sentence, whitespace, line, page, and others.

---------- Buffer: foo ----------
Gentlemen may cry ``Pea∗ce! Peace!,''
but there is no peace.
---------- Buffer: foo ----------

(thing-at-point 'word)
     ⇒ "Peace"
(thing-at-point 'line)
     ⇒ "Gentlemen may cry ``Peace! Peace!,''\n"
(thing-at-point 'whitespace)
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.3 Comparing Text

This function lets you compare portions of the text in a buffer, without copying them into strings first.

Function: compare-buffer-substrings buffer1 start1 end1 buffer2 start2 end2

This function lets you compare two substrings of the same buffer or two different buffers. The first three arguments specify one substring, giving a buffer (or a buffer name) and two positions within the buffer. The last three arguments specify the other substring in the same way. You can use nil for buffer1, buffer2, or both to stand for the current buffer.

The value is negative if the first substring is less, positive if the first is greater, and zero if they are equal. The absolute value of the result is one plus the index of the first differing characters within the substrings.

This function ignores case when comparing characters if case-fold-search is non-nil. It always ignores text properties.

Suppose you have the text ‘foobarbar haha!rara! in the current buffer; then in this example the two substrings are ‘rbar ’ and ‘rara!’. The value is 2 because the first substring is greater at the second character.

(compare-buffer-substrings nil 6 11 nil 16 21)
     ⇒ 2

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.4 Inserting Text

Insertion means adding new text to a buffer. The inserted text goes at point—between the character before point and the character after point. Some insertion functions leave point before the inserted text, while other functions leave it after. We call the former insertion after point and the latter insertion before point.

Insertion moves markers located at positions after the insertion point, so that they stay with the surrounding text (see section Markers). When a marker points at the place of insertion, insertion may or may not relocate the marker, depending on the marker’s insertion type (see section Marker Insertion Types). Certain special functions such as insert-before-markers relocate all such markers to point after the inserted text, regardless of the markers’ insertion type.

Insertion functions signal an error if the current buffer is read-only (see section Read-Only Buffers) or if they insert within read-only text (see section Properties with Special Meanings).

These functions copy text characters from strings and buffers along with their properties. The inserted characters have exactly the same properties as the characters they were copied from. By contrast, characters specified as separate arguments, not part of a string or buffer, inherit their text properties from the neighboring text.

The insertion functions convert text from unibyte to multibyte in order to insert in a multibyte buffer, and vice versa—if the text comes from a string or from a buffer. However, they do not convert unibyte character codes 128 through 255 to multibyte characters, not even if the current buffer is a multibyte buffer. See section Converting Text Representations.

Function: insert &rest args

This function inserts the strings and/or characters args into the current buffer, at point, moving point forward. In other words, it inserts the text before point. An error is signaled unless all args are either strings or characters. The value is nil.

Function: insert-before-markers &rest args

This function inserts the strings and/or characters args into the current buffer, at point, moving point forward. An error is signaled unless all args are either strings or characters. The value is nil.

This function is unlike the other insertion functions in that it relocates markers initially pointing at the insertion point, to point after the inserted text. If an overlay begins at the insertion point, the inserted text falls outside the overlay; if a nonempty overlay ends at the insertion point, the inserted text falls inside that overlay.

Command: insert-char character &optional count inherit

This command inserts count instances of character into the current buffer before point. The argument count must be an integer, and character must be a character.

If called interactively, this command prompts for character using its Unicode name or its code point. See Inserting Text in The GNU Emacs Manual.

This function does not convert unibyte character codes 128 through 255 to multibyte characters, not even if the current buffer is a multibyte buffer. See section Converting Text Representations.

If inherit is non-nil, the inserted characters inherit sticky text properties from the two characters before and after the insertion point. See section Stickiness of Text Properties.

Function: insert-buffer-substring from-buffer-or-name &optional start end

This function inserts a portion of buffer from-buffer-or-name into the current buffer before point. The text inserted is the region between start (inclusive) and end (exclusive). (These arguments default to the beginning and end of the accessible portion of that buffer.) This function returns nil.

In this example, the form is executed with buffer ‘bar’ as the current buffer. We assume that buffer ‘bar’ is initially empty.

---------- Buffer: foo ----------
We hold these truths to be self-evident, that all
---------- Buffer: foo ----------
(insert-buffer-substring "foo" 1 20)
     ⇒ nil

---------- Buffer: bar ----------
We hold these truth∗
---------- Buffer: bar ----------
Function: insert-buffer-substring-no-properties from-buffer-or-name &optional start end

This is like insert-buffer-substring except that it does not copy any text properties.

See section Stickiness of Text Properties, for other insertion functions that inherit text properties from the nearby text in addition to inserting it. Whitespace inserted by indentation functions also inherits text properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.5 User-Level Insertion Commands

This section describes higher-level commands for inserting text, commands intended primarily for the user but useful also in Lisp programs.

Command: insert-buffer from-buffer-or-name

This command inserts the entire accessible contents of from-buffer-or-name (which must exist) into the current buffer after point. It leaves the mark after the inserted text. The value is nil.

Command: self-insert-command count

This command inserts the last character typed; it does so count times, before point, and returns nil. Most printing characters are bound to this command. In routine use, self-insert-command is the most frequently called function in Emacs, but programs rarely use it except to install it on a keymap.

In an interactive call, count is the numeric prefix argument.

Self-insertion translates the input character through translation-table-for-input. See section Translation of Characters.

This command calls auto-fill-function whenever that is non-nil and the character inserted is in the table auto-fill-chars (see section Auto Filling).

This command performs abbrev expansion if Abbrev mode is enabled and the inserted character does not have word-constituent syntax. (See section Abbrevs and Abbrev Expansion, and Table of Syntax Classes.) It is also responsible for calling blink-paren-function when the inserted character has close parenthesis syntax (see section Blinking Parentheses).

The final thing this command does is to run the hook post-self-insert-hook. You could use this to automatically reindent text as it is typed, for example.

Do not try substituting your own definition of self-insert-command for the standard one. The editor command loop handles this function specially.

Command: newline &optional number-of-newlines

This command inserts newlines into the current buffer before point. If number-of-newlines is supplied, that many newline characters are inserted.

This function calls auto-fill-function if the current column number is greater than the value of fill-column and number-of-newlines is nil. Typically what auto-fill-function does is insert a newline; thus, the overall result in this case is to insert two newlines at different places: one at point, and another earlier in the line. newline does not auto-fill if number-of-newlines is non-nil.

This command indents to the left margin if that is not zero. See section Margins for Filling.

The value returned is nil. In an interactive call, count is the numeric prefix argument.

Variable: overwrite-mode

This variable controls whether overwrite mode is in effect. The value should be overwrite-mode-textual, overwrite-mode-binary, or nil. overwrite-mode-textual specifies textual overwrite mode (treats newlines and tabs specially), and overwrite-mode-binary specifies binary overwrite mode (treats newlines and tabs like any other characters).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.6 Deleting Text

Deletion means removing part of the text in a buffer, without saving it in the kill ring (see section The Kill Ring). Deleted text can’t be yanked, but can be reinserted using the undo mechanism (see section Undo). Some deletion functions do save text in the kill ring in some special cases.

All of the deletion functions operate on the current buffer.

Command: erase-buffer

This function deletes the entire text of the current buffer (not just the accessible portion), leaving it empty. If the buffer is read-only, it signals a buffer-read-only error; if some of the text in it is read-only, it signals a text-read-only error. Otherwise, it deletes the text without asking for any confirmation. It returns nil.

Normally, deleting a large amount of text from a buffer inhibits further auto-saving of that buffer “because it has shrunk”. However, erase-buffer does not do this, the idea being that the future text is not really related to the former text, and its size should not be compared with that of the former text.

Command: delete-region start end

This command deletes the text between positions start and end in the current buffer, and returns nil. If point was inside the deleted region, its value afterward is start. Otherwise, point relocates with the surrounding text, as markers do.

Function: delete-and-extract-region start end

This function deletes the text between positions start and end in the current buffer, and returns a string containing the text just deleted.

If point was inside the deleted region, its value afterward is start. Otherwise, point relocates with the surrounding text, as markers do.

Command: delete-char count &optional killp

This command deletes count characters directly after point, or before point if count is negative. If killp is non-nil, then it saves the deleted characters in the kill ring.

In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.

The value returned is always nil.

Command: delete-backward-char count &optional killp

This command deletes count characters directly before point, or after point if count is negative. If killp is non-nil, then it saves the deleted characters in the kill ring.

In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.

The value returned is always nil.

Command: backward-delete-char-untabify count &optional killp

This command deletes count characters backward, changing tabs into spaces. When the next character to be deleted is a tab, it is first replaced with the proper number of spaces to preserve alignment and then one of those spaces is deleted instead of the tab. If killp is non-nil, then the command saves the deleted characters in the kill ring.

Conversion of tabs to spaces happens only if count is positive. If it is negative, exactly -count characters after point are deleted.

In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.

The value returned is always nil.

User Option: backward-delete-char-untabify-method

This option specifies how backward-delete-char-untabify should deal with whitespace. Possible values include untabify, the default, meaning convert a tab to many spaces and delete one; hungry, meaning delete all tabs and spaces before point with one command; all meaning delete all tabs, spaces and newlines before point, and nil, meaning do nothing special for whitespace characters.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.7 User-Level Deletion Commands

This section describes higher-level commands for deleting text, commands intended primarily for the user but useful also in Lisp programs.

Command: delete-horizontal-space &optional backward-only

This function deletes all spaces and tabs around point. It returns nil.

If backward-only is non-nil, the function deletes spaces and tabs before point, but not after point.

In the following examples, we call delete-horizontal-space four times, once on each line, with point between the second and third characters on the line each time.

---------- Buffer: foo ----------
I ∗thought
I ∗     thought
We∗ thought
Yo∗u thought
---------- Buffer: foo ----------
(delete-horizontal-space)   ; Four times.
     ⇒ nil

---------- Buffer: foo ----------
Ithought
Ithought
Wethought
You thought
---------- Buffer: foo ----------
Command: delete-indentation &optional join-following-p

This function joins the line point is on to the previous line, deleting any whitespace at the join and in some cases replacing it with one space. If join-following-p is non-nil, delete-indentation joins this line to the following line instead. The function returns nil.

If there is a fill prefix, and the second of the lines being joined starts with the prefix, then delete-indentation deletes the fill prefix before joining the lines. See section Margins for Filling.

In the example below, point is located on the line starting ‘events’, and it makes no difference if there are trailing spaces in the preceding line.

---------- Buffer: foo ----------
When in the course of human
∗    events, it becomes necessary
---------- Buffer: foo ----------
(delete-indentation)
     ⇒ nil

---------- Buffer: foo ----------
When in the course of human∗ events, it becomes necessary
---------- Buffer: foo ----------

After the lines are joined, the function fixup-whitespace is responsible for deciding whether to leave a space at the junction.

Command: fixup-whitespace

This function replaces all the horizontal whitespace surrounding point with either one space or no space, according to the context. It returns nil.

At the beginning or end of a line, the appropriate amount of space is none. Before a character with close parenthesis syntax, or after a character with open parenthesis or expression-prefix syntax, no space is also appropriate. Otherwise, one space is appropriate. See section Table of Syntax Classes.

In the example below, fixup-whitespace is called the first time with point before the word ‘spaces’ in the first line. For the second invocation, point is directly after the ‘(’.

---------- Buffer: foo ----------
This has too many     ∗spaces
This has too many spaces at the start of (∗   this list)
---------- Buffer: foo ----------
(fixup-whitespace)
     ⇒ nil
(fixup-whitespace)
     ⇒ nil
---------- Buffer: foo ----------
This has too many spaces
This has too many spaces at the start of (this list)
---------- Buffer: foo ----------
Command: just-one-space &optional n

This command replaces any spaces and tabs around point with a single space, or n spaces if n is specified. It returns nil.

Command: delete-blank-lines

This function deletes blank lines surrounding point. If point is on a blank line with one or more blank lines before or after it, then all but one of them are deleted. If point is on an isolated blank line, then it is deleted. If point is on a nonblank line, the command deletes all blank lines immediately following it.

A blank line is defined as a line containing only tabs and spaces.

delete-blank-lines returns nil.

Command: delete-trailing-whitespace start end

Delete trailing whitespace in the region defined by start and end.

This command deletes whitespace characters after the last non-whitespace character in each line in the region.

If this command acts on the entire buffer (i.e. if called interactively with the mark inactive, or called from Lisp with end nil), it also deletes all trailing lines at the end of the buffer if the variable delete-trailing-lines is non-nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8 The Kill Ring

Kill functions delete text like the deletion functions, but save it so that the user can reinsert it by yanking. Most of these functions have ‘kill-’ in their name. By contrast, the functions whose names start with ‘delete-’ normally do not save text for yanking (though they can still be undone); these are “deletion” functions.

Most of the kill commands are primarily for interactive use, and are not described here. What we do describe are the functions provided for use in writing such commands. You can use these functions to write commands for killing text. When you need to delete text for internal purposes within a Lisp function, you should normally use deletion functions, so as not to disturb the kill ring contents. See section Deleting Text.

Killed text is saved for later yanking in the kill ring. This is a list that holds a number of recent kills, not just the last text kill. We call this a “ring” because yanking treats it as having elements in a cyclic order. The list is kept in the variable kill-ring, and can be operated on with the usual functions for lists; there are also specialized functions, described in this section, that treat it as a ring.

Some people think this use of the word “kill” is unfortunate, since it refers to operations that specifically do not destroy the entities “killed”. This is in sharp contrast to ordinary life, in which death is permanent and “killed” entities do not come back to life. Therefore, other metaphors have been proposed. For example, the term “cut ring” makes sense to people who, in pre-computer days, used scissors and paste to cut up and rearrange manuscripts. However, it would be difficult to change the terminology now.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.1 Kill Ring Concepts

The kill ring records killed text as strings in a list, most recent first. A short kill ring, for example, might look like this:

("some text" "a different piece of text" "even older text")

When the list reaches kill-ring-max entries in length, adding a new entry automatically deletes the last entry.

When kill commands are interwoven with other commands, each kill command makes a new entry in the kill ring. Multiple kill commands in succession build up a single kill ring entry, which would be yanked as a unit; the second and subsequent consecutive kill commands add text to the entry made by the first one.

For yanking, one entry in the kill ring is designated the “front” of the ring. Some yank commands “rotate” the ring by designating a different element as the “front”. But this virtual rotation doesn’t change the list itself—the most recent entry always comes first in the list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.2 Functions for Killing

kill-region is the usual subroutine for killing text. Any command that calls this function is a “kill command” (and should probably have ‘kill’ in its name). kill-region puts the newly killed text in a new element at the beginning of the kill ring or adds it to the most recent element. It determines automatically (using last-command) whether the previous command was a kill command, and if so appends the killed text to the most recent entry.

Command: kill-region start end

This function kills the text in the region defined by start and end. The text is deleted but saved in the kill ring, along with its text properties. The value is always nil.

In an interactive call, start and end are point and the mark.

If the buffer or text is read-only, kill-region modifies the kill ring just the same, then signals an error without modifying the buffer. This is convenient because it lets the user use a series of kill commands to copy text from a read-only buffer into the kill ring.

User Option: kill-read-only-ok

If this option is non-nil, kill-region does not signal an error if the buffer or text is read-only. Instead, it simply returns, updating the kill ring but not changing the buffer.

Command: copy-region-as-kill start end

This command saves the region defined by start and end on the kill ring (including text properties), but does not delete the text from the buffer. It returns nil.

The command does not set this-command to kill-region, so a subsequent kill command does not append to the same kill ring entry.

In Lisp programs, it is better to use kill-new or kill-append instead of this command. See section Low-Level Kill Ring.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.3 Yanking

Yanking means inserting text from the kill ring, but it does not insert the text blindly. The yank command, and related commands, use insert-for-yank to perform special processing on the text before it is inserted.

Function: insert-for-yank string

This function works like insert, except that it processes the text in string according to the yank-handler text property, as well as the variables yank-handled-properties and yank-excluded-properties (see below), before inserting the result into the current buffer.

Function: insert-buffer-substring-as-yank buf &optional start end

This function resembles insert-buffer-substring, except that it processes the text according to yank-handled-properties and yank-excluded-properties. (It does not handle the yank-handler property, which does not normally occur in buffer text anyway.)

If you put a yank-handler text property on all or part of a string, that alters how insert-for-yank inserts the string. If different parts of the string have different yank-handler values (comparison being done with eq), each substring is handled separately. The property value must be a list of one to four elements, with the following format (where elements after the first may be omitted):

(function param noexclude undo)

Here is what the elements do:

function

When function is non-nil, it is called instead of insert to insert the string, with one argument—the string to insert.

param

If param is present and non-nil, it replaces string (or the substring of string being processed) as the object passed to function (or insert). For example, if function is yank-rectangle, param should be a list of strings to insert as a rectangle.

noexclude

If noexclude is present and non-nil, that disables the normal action of yank-handled-properties and yank-excluded-properties on the inserted string.

undo

If undo is present and non-nil, it is a function that will be called by yank-pop to undo the insertion of the current object. It is called with two arguments, the start and end of the current region. function can set yank-undo-function to override the undo value.

User Option: yank-handled-properties

This variable specifies special text property handling conditions for yanked text. It takes effect after the text has been inserted (either normally, or via the yank-handler property), and prior to yank-excluded-properties taking effect.

The value should be an alist of elements (prop . fun). Each alist element is handled in order. The inserted text is scanned for stretches of text having text properties eq to prop; for each such stretch, fun is called with three arguments: the value of the property, and the start and end positions of the text.

User Option: yank-excluded-properties

The value of this variable is the list of properties to remove from inserted text. Its default value contains properties that might lead to annoying results, such as causing the text to respond to the mouse or specifying key bindings. It takes effect after yank-handled-properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.4 Functions for Yanking

This section describes higher-level commands for yanking, which are intended primarily for the user but useful also in Lisp programs. Both yank and yank-pop honor the yank-excluded-properties variable and yank-handler text property (see section Yanking).

Command: yank &optional arg

This command inserts before point the text at the front of the kill ring. It sets the mark at the beginning of that text, using push-mark (see section The Mark), and puts point at the end.

If arg is a non-nil list (which occurs interactively when the user types C-u with no digits), then yank inserts the text as described above, but puts point before the yanked text and sets the mark after it.

If arg is a number, then yank inserts the argth most recently killed text—the argth element of the kill ring list, counted cyclically from the front, which is considered the first element for this purpose.

yank does not alter the contents of the kill ring, unless it used text provided by another program, in which case it pushes that text onto the kill ring. However if arg is an integer different from one, it rotates the kill ring to place the yanked string at the front.

yank returns nil.

Command: yank-pop &optional arg

This command replaces the just-yanked entry from the kill ring with a different entry from the kill ring.

This is allowed only immediately after a yank or another yank-pop. At such a time, the region contains text that was just inserted by yanking. yank-pop deletes that text and inserts in its place a different piece of killed text. It does not add the deleted text to the kill ring, since it is already in the kill ring somewhere. It does however rotate the kill ring to place the newly yanked string at the front.

If arg is nil, then the replacement text is the previous element of the kill ring. If arg is numeric, the replacement is the argth previous kill. If arg is negative, a more recent kill is the replacement.

The sequence of kills in the kill ring wraps around, so that after the oldest one comes the newest one, and before the newest one goes the oldest.

The return value is always nil.

Variable: yank-undo-function

If this variable is non-nil, the function yank-pop uses its value instead of delete-region to delete the text inserted by the previous yank or yank-pop command. The value must be a function of two arguments, the start and end of the current region.

The function insert-for-yank automatically sets this variable according to the undo element of the yank-handler text property, if there is one.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.5 Low-Level Kill Ring

These functions and variables provide access to the kill ring at a lower level, but are still convenient for use in Lisp programs, because they take care of interaction with window system selections (see section Window System Selections).

Function: current-kill n &optional do-not-move

The function current-kill rotates the yanking pointer, which designates the “front” of the kill ring, by n places (from newer kills to older ones), and returns the text at that place in the ring.

If the optional second argument do-not-move is non-nil, then current-kill doesn’t alter the yanking pointer; it just returns the nth kill, counting from the current yanking pointer.

If n is zero, indicating a request for the latest kill, current-kill calls the value of interprogram-paste-function (documented below) before consulting the kill ring. If that value is a function and calling it returns a string or a list of several string, current-kill pushes the strings onto the kill ring and returns the first string. It also sets the yanking pointer to point to the kill-ring entry of the first string returned by interprogram-paste-function, regardless of the value of do-not-move. Otherwise, current-kill does not treat a zero value for n specially: it returns the entry pointed at by the yanking pointer and does not move the yanking pointer.

Function: kill-new string &optional replace

This function pushes the text string onto the kill ring and makes the yanking pointer point to it. It discards the oldest entry if appropriate. It also invokes the value of interprogram-cut-function (see below).

If replace is non-nil, then kill-new replaces the first element of the kill ring with string, rather than pushing string onto the kill ring.

Function: kill-append string before-p

This function appends the text string to the first entry in the kill ring and makes the yanking pointer point to the combined entry. Normally string goes at the end of the entry, but if before-p is non-nil, it goes at the beginning. This function also invokes the value of interprogram-cut-function (see below).

Variable: interprogram-paste-function

This variable provides a way of transferring killed text from other programs, when you are using a window system. Its value should be nil or a function of no arguments.

If the value is a function, current-kill calls it to get the “most recent kill”. If the function returns a non-nil value, then that value is used as the “most recent kill”. If it returns nil, then the front of the kill ring is used.

To facilitate support for window systems that support multiple selections, this function may also return a list of strings. In that case, the first string is used as the “most recent kill”, and all the other strings are pushed onto the kill ring, for easy access by yank-pop.

The normal use of this function is to get the window system’s clipboard as the most recent kill, even if the selection belongs to another application. See section Window System Selections. However, if the clipboard contents come from the current Emacs session, this function should return nil.

Variable: interprogram-cut-function

This variable provides a way of communicating killed text to other programs, when you are using a window system. Its value should be nil or a function of one required argument.

If the value is a function, kill-new and kill-append call it with the new first element of the kill ring as the argument.

The normal use of this function is to put newly killed text in the window system’s clipboard. See section Window System Selections.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.6 Internals of the Kill Ring

The variable kill-ring holds the kill ring contents, in the form of a list of strings. The most recent kill is always at the front of the list.

The kill-ring-yank-pointer variable points to a link in the kill ring list, whose CAR is the text to yank next. We say it identifies the “front” of the ring. Moving kill-ring-yank-pointer to a different link is called rotating the kill ring. We call the kill ring a “ring” because the functions that move the yank pointer wrap around from the end of the list to the beginning, or vice-versa. Rotation of the kill ring is virtual; it does not change the value of kill-ring.

Both kill-ring and kill-ring-yank-pointer are Lisp variables whose values are normally lists. The word “pointer” in the name of the kill-ring-yank-pointer indicates that the variable’s purpose is to identify one element of the list for use by the next yank command.

The value of kill-ring-yank-pointer is always eq to one of the links in the kill ring list. The element it identifies is the CAR of that link. Kill commands, which change the kill ring, also set this variable to the value of kill-ring. The effect is to rotate the ring so that the newly killed text is at the front.

Here is a diagram that shows the variable kill-ring-yank-pointer pointing to the second entry in the kill ring ("some text" "a different piece of text" "yet older text").

kill-ring                  ---- kill-ring-yank-pointer
  |                       |
  |                       v
  |     --- ---          --- ---      --- ---
   --> |   |   |------> |   |   |--> |   |   |--> nil
        --- ---          --- ---      --- ---
         |                |            |
         |                |            |
         |                |             -->"yet older text"
         |                |
         |                 --> "a different piece of text"
         |
          --> "some text"

This state of affairs might occur after C-y (yank) immediately followed by M-y (yank-pop).

Variable: kill-ring

This variable holds the list of killed text sequences, most recently killed first.

Variable: kill-ring-yank-pointer

This variable’s value indicates which element of the kill ring is at the “front” of the ring for yanking. More precisely, the value is a tail of the value of kill-ring, and its CAR is the kill string that C-y should yank.

User Option: kill-ring-max

The value of this variable is the maximum length to which the kill ring can grow, before elements are thrown away at the end. The default value for kill-ring-max is 60.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.9 Undo

Most buffers have an undo list, which records all changes made to the buffer’s text so that they can be undone. (The buffers that don’t have one are usually special-purpose buffers for which Emacs assumes that undoing is not useful. In particular, any buffer whose name begins with a space has its undo recording off by default; see Buffer Names.) All the primitives that modify the text in the buffer automatically add elements to the front of the undo list, which is in the variable buffer-undo-list.

Variable: buffer-undo-list

This buffer-local variable’s value is the undo list of the current buffer. A value of t disables the recording of undo information.

Here are the kinds of elements an undo list can have:

position

This kind of element records a previous value of point; undoing this element moves point to position. Ordinary cursor motion does not make any sort of undo record, but deletion operations use these entries to record where point was before the command.

(beg . end)

This kind of element indicates how to delete text that was inserted. Upon insertion, the text occupied the range begend in the buffer.

(text . position)

This kind of element indicates how to reinsert text that was deleted. The deleted text itself is the string text. The place to reinsert it is (abs position). If position is positive, point was at the beginning of the deleted text, otherwise it was at the end. Zero or more (marker . adjustment) elements follow immediately after this element.

(t . time-flag)

This kind of element indicates that an unmodified buffer became modified. A time-flag of the form (sec-high sec-low microsec picosec) represents the visited file’s modification time as of when it was previously visited or saved, using the same format as current-time; see Time of Day. A time-flag of 0 means the buffer does not correspond to any file; -1 means the visited file previously did not exist. primitive-undo uses these values to determine whether to mark the buffer as unmodified once again; it does so only if the file’s status matches that of time-flag.

(nil property value beg . end)

This kind of element records a change in a text property. Here’s how you might undo the change:

(put-text-property beg end property value)
(marker . adjustment)

This kind of element records the fact that the marker marker was relocated due to deletion of surrounding text, and that it moved adjustment character positions. If the marker’s location is consistent with the (text . position) element preceding it in the undo list, then undoing this element moves marker - adjustment characters.

(apply funname . args)

This is an extensible undo item, which is undone by calling funname with arguments args.

(apply delta beg end funname . args)

This is an extensible undo item, which records a change limited to the range beg to end, which increased the size of the buffer by delta characters. It is undone by calling funname with arguments args.

This kind of element enables undo limited to a region to determine whether the element pertains to that region.

nil

This element is a boundary. The elements between two boundaries are called a change group; normally, each change group corresponds to one keyboard command, and undo commands normally undo an entire group as a unit.

Function: undo-boundary

This function places a boundary element in the undo list. The undo command stops at such a boundary, and successive undo commands undo to earlier and earlier boundaries. This function returns nil.

The editor command loop automatically calls undo-boundary just before executing each key sequence, so that each undo normally undoes the effects of one command. As an exception, the command self-insert-command, which produces self-inserting input characters (see section User-Level Insertion Commands), may remove the boundary inserted by the command loop: a boundary is accepted for the first such character, the next 19 consecutive self-inserting input characters do not have boundaries, and then the 20th does; and so on as long as the self-inserting characters continue. Hence, sequences of consecutive character insertions can be undone as a group.

All buffer modifications add a boundary whenever the previous undoable change was made in some other buffer. This is to ensure that each command makes a boundary in each buffer where it makes changes.

Calling this function explicitly is useful for splitting the effects of a command into more than one unit. For example, query-replace calls undo-boundary after each replacement, so that the user can undo individual replacements one by one.

Variable: undo-in-progress

This variable is normally nil, but the undo commands bind it to t. This is so that various kinds of change hooks can tell when they’re being called for the sake of undoing.

Function: primitive-undo count list

This is the basic function for undoing elements of an undo list. It undoes the first count elements of list, returning the rest of list.

primitive-undo adds elements to the buffer’s undo list when it changes the buffer. Undo commands avoid confusion by saving the undo list value at the beginning of a sequence of undo operations. Then the undo operations use and update the saved value. The new elements added by undoing are not part of this saved value, so they don’t interfere with continuing to undo.

This function does not bind undo-in-progress.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.10 Maintaining Undo Lists

This section describes how to enable and disable undo information for a given buffer. It also explains how the undo list is truncated automatically so it doesn’t get too big.

Recording of undo information in a newly created buffer is normally enabled to start with; but if the buffer name starts with a space, the undo recording is initially disabled. You can explicitly enable or disable undo recording with the following two functions, or by setting buffer-undo-list yourself.

Command: buffer-enable-undo &optional buffer-or-name

This command enables recording undo information for buffer buffer-or-name, so that subsequent changes can be undone. If no argument is supplied, then the current buffer is used. This function does nothing if undo recording is already enabled in the buffer. It returns nil.

In an interactive call, buffer-or-name is the current buffer. You cannot specify any other buffer.

Command: buffer-disable-undo &optional buffer-or-name

This function discards the undo list of buffer-or-name, and disables further recording of undo information. As a result, it is no longer possible to undo either previous changes or any subsequent changes. If the undo list of buffer-or-name is already disabled, this function has no effect.

In an interactive call, BUFFER-OR-NAME is the current buffer. You cannot specify any other buffer. This function returns nil.

As editing continues, undo lists get longer and longer. To prevent them from using up all available memory space, garbage collection trims them back to size limits you can set. (For this purpose, the “size” of an undo list measures the cons cells that make up the list, plus the strings of deleted text.) Three variables control the range of acceptable sizes: undo-limit, undo-strong-limit and undo-outer-limit. In these variables, size is counted as the number of bytes occupied, which includes both saved text and other data.

User Option: undo-limit

This is the soft limit for the acceptable size of an undo list. The change group at which this size is exceeded is the last one kept.

User Option: undo-strong-limit

This is the upper limit for the acceptable size of an undo list. The change group at which this size is exceeded is discarded itself (along with all older change groups). There is one exception: the very latest change group is only discarded if it exceeds undo-outer-limit.

User Option: undo-outer-limit

If at garbage collection time the undo info for the current command exceeds this limit, Emacs discards the info and displays a warning. This is a last ditch limit to prevent memory overflow.

User Option: undo-ask-before-discard

If this variable is non-nil, when the undo info exceeds undo-outer-limit, Emacs asks in the echo area whether to discard the info. The default value is nil, which means to discard it automatically.

This option is mainly intended for debugging. Garbage collection is inhibited while the question is asked, which means that Emacs might leak memory if the user waits too long before answering the question.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.11 Filling

Filling means adjusting the lengths of lines (by moving the line breaks) so that they are nearly (but no greater than) a specified maximum width. Additionally, lines can be justified, which means inserting spaces to make the left and/or right margins line up precisely. The width is controlled by the variable fill-column. For ease of reading, lines should be no longer than 70 or so columns.

You can use Auto Fill mode (see section Auto Filling) to fill text automatically as you insert it, but changes to existing text may leave it improperly filled. Then you must fill the text explicitly.

Most of the commands in this section return values that are not meaningful. All the functions that do filling take note of the current left margin, current right margin, and current justification style (see section Margins for Filling). If the current justification style is none, the filling functions don’t actually do anything.

Several of the filling functions have an argument justify. If it is non-nil, that requests some kind of justification. It can be left, right, full, or center, to request a specific style of justification. If it is t, that means to use the current justification style for this part of the text (see current-justification, below). Any other value is treated as full.

When you call the filling functions interactively, using a prefix argument implies the value full for justify.

Command: fill-paragraph &optional justify region

This command fills the paragraph at or after point. If justify is non-nil, each line is justified as well. It uses the ordinary paragraph motion commands to find paragraph boundaries. See Paragraphs in The GNU Emacs Manual.

When region is non-nil, then if Transient Mark mode is enabled and the mark is active, this command calls fill-region to fill all the paragraphs in the region, instead of filling only the current paragraph. When this command is called interactively, region is t.

Command: fill-region start end &optional justify nosqueeze to-eop

This command fills each of the paragraphs in the region from start to end. It justifies as well if justify is non-nil.

If nosqueeze is non-nil, that means to leave whitespace other than line breaks untouched. If to-eop is non-nil, that means to keep filling to the end of the paragraph—or the next hard newline, if use-hard-newlines is enabled (see below).

The variable paragraph-separate controls how to distinguish paragraphs. See section Standard Regular Expressions Used in Editing.

Command: fill-individual-paragraphs start end &optional justify citation-regexp

This command fills each paragraph in the region according to its individual fill prefix. Thus, if the lines of a paragraph were indented with spaces, the filled paragraph will remain indented in the same fashion.

The first two arguments, start and end, are the beginning and end of the region to be filled. The third and fourth arguments, justify and citation-regexp, are optional. If justify is non-nil, the paragraphs are justified as well as filled. If citation-regexp is non-nil, it means the function is operating on a mail message and therefore should not fill the header lines. If citation-regexp is a string, it is used as a regular expression; if it matches the beginning of a line, that line is treated as a citation marker.

Ordinarily, fill-individual-paragraphs regards each change in indentation as starting a new paragraph. If fill-individual-varying-indent is non-nil, then only separator lines separate paragraphs. That mode can handle indented paragraphs with additional indentation on the first line.

User Option: fill-individual-varying-indent

This variable alters the action of fill-individual-paragraphs as described above.

Command: fill-region-as-paragraph start end &optional justify nosqueeze squeeze-after

This command considers a region of text as a single paragraph and fills it. If the region was made up of many paragraphs, the blank lines between paragraphs are removed. This function justifies as well as filling when justify is non-nil.

If nosqueeze is non-nil, that means to leave whitespace other than line breaks untouched. If squeeze-after is non-nil, it specifies a position in the region, and means don’t canonicalize spaces before that position.

In Adaptive Fill mode, this command calls fill-context-prefix to choose a fill prefix by default. See section Adaptive Fill Mode.

Command: justify-current-line &optional how eop nosqueeze

This command inserts spaces between the words of the current line so that the line ends exactly at fill-column. It returns nil.

The argument how, if non-nil specifies explicitly the style of justification. It can be left, right, full, center, or none. If it is t, that means to do follow specified justification style (see current-justification, below). nil means to do full justification.

If eop is non-nil, that means do only left-justification if current-justification specifies full justification. This is used for the last line of a paragraph; even if the paragraph as a whole is fully justified, the last line should not be.

If nosqueeze is non-nil, that means do not change interior whitespace.

User Option: default-justification

This variable’s value specifies the style of justification to use for text that doesn’t specify a style with a text property. The possible values are left, right, full, center, or none. The default value is left.

Function: current-justification

This function returns the proper justification style to use for filling the text around point.

This returns the value of the justification text property at point, or the variable default-justification if there is no such text property. However, it returns nil rather than none to mean “don’t justify”.

User Option: sentence-end-double-space

If this variable is non-nil, a period followed by just one space does not count as the end of a sentence, and the filling functions avoid breaking the line at such a place.

User Option: sentence-end-without-period

If this variable is non-nil, a sentence can end without a period. This is used for languages like Thai, where sentences end with a double space but without a period.

User Option: sentence-end-without-space

If this variable is non-nil, it should be a string of characters that can end a sentence without following spaces.

Variable: fill-paragraph-function

This variable provides a way to override the filling of paragraphs. If its value is non-nil, fill-paragraph calls this function to do the work. If the function returns a non-nil value, fill-paragraph assumes the job is done, and immediately returns that value.

The usual use of this feature is to fill comments in programming language modes. If the function needs to fill a paragraph in the usual way, it can do so as follows:

(let ((fill-paragraph-function nil))
  (fill-paragraph arg))
Variable: fill-forward-paragraph-function

This variable provides a way to override how the filling functions, such as fill-region and fill-paragraph, move forward to the next paragraph. Its value should be a function, which is called with a single argument n, the number of paragraphs to move, and should return the difference between n and the number of paragraphs actually moved. The default value of this variable is forward-paragraph. See Paragraphs in The GNU Emacs Manual.

Variable: use-hard-newlines

If this variable is non-nil, the filling functions do not delete newlines that have the hard text property. These “hard newlines” act as paragraph separators. See Hard and Soft Newlines in The GNU Emacs Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.12 Margins for Filling

User Option: fill-prefix

This buffer-local variable, if non-nil, specifies a string of text that appears at the beginning of normal text lines and should be disregarded when filling them. Any line that fails to start with the fill prefix is considered the start of a paragraph; so is any line that starts with the fill prefix followed by additional whitespace. Lines that start with the fill prefix but no additional whitespace are ordinary text lines that can be filled together. The resulting filled lines also start with the fill prefix.

The fill prefix follows the left margin whitespace, if any.

User Option: fill-column

This buffer-local variable specifies the maximum width of filled lines. Its value should be an integer, which is a number of columns. All the filling, justification, and centering commands are affected by this variable, including Auto Fill mode (see section Auto Filling).

As a practical matter, if you are writing text for other people to read, you should set fill-column to no more than 70. Otherwise the line will be too long for people to read comfortably, and this can make the text seem clumsy.

The default value for fill-column is 70.

Command: set-left-margin from to margin

This sets the left-margin property on the text from from to to to the value margin. If Auto Fill mode is enabled, this command also refills the region to fit the new margin.

Command: set-right-margin from to margin

This sets the right-margin property on the text from from to to to the value margin. If Auto Fill mode is enabled, this command also refills the region to fit the new margin.

Function: current-left-margin

This function returns the proper left margin value to use for filling the text around point. The value is the sum of the left-margin property of the character at the start of the current line (or zero if none), and the value of the variable left-margin.

Function: current-fill-column

This function returns the proper fill column value to use for filling the text around point. The value is the value of the fill-column variable, minus the value of the right-margin property of the character after point.

Command: move-to-left-margin &optional n force

This function moves point to the left margin of the current line. The column moved to is determined by calling the function current-left-margin. If the argument n is non-nil, move-to-left-margin moves forward n-1 lines first.

If force is non-nil, that says to fix the line’s indentation if that doesn’t match the left margin value.

Function: delete-to-left-margin &optional from to

This function removes left margin indentation from the text between from and to. The amount of indentation to delete is determined by calling current-left-margin. In no case does this function delete non-whitespace. If from and to are omitted, they default to the whole buffer.

Function: indent-to-left-margin

This function adjusts the indentation at the beginning of the current line to the value specified by the variable left-margin. (That may involve either inserting or deleting whitespace.) This function is value of indent-line-function in Paragraph-Indent Text mode.

User Option: left-margin

This variable specifies the base left margin column. In Fundamental mode, RET indents to this column. This variable automatically becomes buffer-local when set in any fashion.

User Option: fill-nobreak-predicate

This variable gives major modes a way to specify not to break a line at certain places. Its value should be a list of functions. Whenever filling considers breaking the line at a certain place in the buffer, it calls each of these functions with no arguments and with point located at that place. If any of the functions returns non-nil, then the line won’t be broken there.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.13 Adaptive Fill Mode

When Adaptive Fill Mode is enabled, Emacs determines the fill prefix automatically from the text in each paragraph being filled rather than using a predetermined value. During filling, this fill prefix gets inserted at the start of the second and subsequent lines of the paragraph as described in Filling, and in Auto Filling.

User Option: adaptive-fill-mode

Adaptive Fill mode is enabled when this variable is non-nil. It is t by default.

Function: fill-context-prefix from to

This function implements the heart of Adaptive Fill mode; it chooses a fill prefix based on the text between from and to, typically the start and end of a paragraph. It does this by looking at the first two lines of the paragraph, based on the variables described below.

Usually, this function returns the fill prefix, a string. However, before doing this, the function makes a final check (not specially mentioned in the following) that a line starting with this prefix wouldn’t look like the start of a paragraph. Should this happen, the function signals the anomaly by returning nil instead.

In detail, fill-context-prefix does this:

  1. It takes a candidate for the fill prefix from the first line—it tries first the function in adaptive-fill-function (if any), then the regular expression adaptive-fill-regexp (see below). The first non-nil result of these, or the empty string if they’re both nil, becomes the first line’s candidate.
  2. If the paragraph has as yet only one line, the function tests the validity of the prefix candidate just found. The function then returns the candidate if it’s valid, or a string of spaces otherwise. (see the description of adaptive-fill-first-line-regexp below).
  3. When the paragraph already has two lines, the function next looks for a prefix candidate on the second line, in just the same way it did for the first line. If it doesn’t find one, it returns nil.
  4. The function now compares the two candidate prefixes heuristically: if the non-whitespace characters in the line 2 candidate occur in the same order in the line 1 candidate, the function returns the line 2 candidate. Otherwise, it returns the largest initial substring which is common to both candidates (which might be the empty string).
User Option: adaptive-fill-regexp

Adaptive Fill mode matches this regular expression against the text starting after the left margin whitespace (if any) on a line; the characters it matches are that line’s candidate for the fill prefix.

The default value matches whitespace with certain punctuation characters intermingled.

User Option: adaptive-fill-first-line-regexp

Used only in one-line paragraphs, this regular expression acts as an additional check of the validity of the one available candidate fill prefix: the candidate must match this regular expression, or match comment-start-skip. If it doesn’t, fill-context-prefix replaces the candidate with a string of spaces “of the same width” as it.

The default value of this variable is "\\`[ \t]*\\'", which matches only a string of whitespace. The effect of this default is to force the fill prefixes found in one-line paragraphs always to be pure whitespace.

User Option: adaptive-fill-function

You can specify more complex ways of choosing a fill prefix automatically by setting this variable to a function. The function is called with point after the left margin (if any) of a line, and it must preserve point. It should return either “that line’s” fill prefix or nil, meaning it has failed to determine a prefix.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.14 Auto Filling

Auto Fill mode is a minor mode that fills lines automatically as text is inserted. This section describes the hook used by Auto Fill mode. For a description of functions that you can call explicitly to fill and justify existing text, see Filling.

Auto Fill mode also enables the functions that change the margins and justification style to refill portions of the text. See section Margins for Filling.

Variable: auto-fill-function

The value of this buffer-local variable should be a function (of no arguments) to be called after self-inserting a character from the table auto-fill-chars. It may be nil, in which case nothing special is done in that case.

The value of auto-fill-function is do-auto-fill when Auto-Fill mode is enabled. That is a function whose sole purpose is to implement the usual strategy for breaking a line.

Variable: normal-auto-fill-function

This variable specifies the function to use for auto-fill-function, if and when Auto Fill is turned on. Major modes can set buffer-local values for this variable to alter how Auto Fill works.

Variable: auto-fill-chars

A char table of characters which invoke auto-fill-function when self-inserted—space and newline in most language environments. They have an entry t in the table.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.15 Sorting Text

The sorting functions described in this section all rearrange text in a buffer. This is in contrast to the function sort, which rearranges the order of the elements of a list (see section Functions that Rearrange Lists). The values returned by these functions are not meaningful.

Function: sort-subr reverse nextrecfun endrecfun &optional startkeyfun endkeyfun predicate

This function is the general text-sorting routine that subdivides a buffer into records and then sorts them. Most of the commands in this section use this function.

To understand how sort-subr works, consider the whole accessible portion of the buffer as being divided into disjoint pieces called sort records. The records may or may not be contiguous, but they must not overlap. A portion of each sort record (perhaps all of it) is designated as the sort key. Sorting rearranges the records in order by their sort keys.

Usually, the records are rearranged in order of ascending sort key. If the first argument to the sort-subr function, reverse, is non-nil, the sort records are rearranged in order of descending sort key.

The next four arguments to sort-subr are functions that are called to move point across a sort record. They are called many times from within sort-subr.

  1. nextrecfun is called with point at the end of a record. This function moves point to the start of the next record. The first record is assumed to start at the position of point when sort-subr is called. Therefore, you should usually move point to the beginning of the buffer before calling sort-subr.

    This function can indicate there are no more sort records by leaving point at the end of the buffer.

  2. endrecfun is called with point within a record. It moves point to the end of the record.
  3. startkeyfun is called to move point from the start of a record to the start of the sort key. This argument is optional; if it is omitted, the whole record is the sort key. If supplied, the function should either return a non-nil value to be used as the sort key, or return nil to indicate that the sort key is in the buffer starting at point. In the latter case, endkeyfun is called to find the end of the sort key.
  4. endkeyfun is called to move point from the start of the sort key to the end of the sort key. This argument is optional. If startkeyfun returns nil and this argument is omitted (or nil), then the sort key extends to the end of the record. There is no need for endkeyfun if startkeyfun returns a non-nil value.

The argument predicate is the function to use to compare keys. If keys are numbers, it defaults to <; otherwise it defaults to string<.

As an example of sort-subr, here is the complete function definition for sort-lines:

;; Note that the first two lines of doc string
;; are effectively one line when viewed by a user.
(defun sort-lines (reverse beg end)
  "Sort lines in region alphabetically;\
 argument means descending order.
Called from a program, there are three arguments:
REVERSE (non-nil means reverse order),\
 BEG and END (region to sort).
The variable `sort-fold-case' determines\
 whether alphabetic case affects
the sort order."
  (interactive "P\nr")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (let ((inhibit-field-text-motion t))
        (sort-subr reverse 'forward-line 'end-of-line)))))

Here forward-line moves point to the start of the next record, and end-of-line moves point to the end of record. We do not pass the arguments startkeyfun and endkeyfun, because the entire record is used as the sort key.

The sort-paragraphs function is very much the same, except that its sort-subr call looks like this:

(sort-subr reverse
           (function
            (lambda ()
              (while (and (not (eobp))
                          (looking-at paragraph-separate))
                (forward-line 1))))
           'forward-paragraph)

Markers pointing into any sort records are left with no useful position after sort-subr returns.

User Option: sort-fold-case

If this variable is non-nil, sort-subr and the other buffer sorting functions ignore case when comparing strings.

Command: sort-regexp-fields reverse record-regexp key-regexp start end

This command sorts the region between start and end alphabetically as specified by record-regexp and key-regexp. If reverse is a negative integer, then sorting is in reverse order.

Alphabetical sorting means that two sort keys are compared by comparing the first characters of each, the second characters of each, and so on. If a mismatch is found, it means that the sort keys are unequal; the sort key whose character is less at the point of first mismatch is the lesser sort key. The individual characters are compared according to their numerical character codes in the Emacs character set.

The value of the record-regexp argument specifies how to divide the buffer into sort records. At the end of each record, a search is done for this regular expression, and the text that matches it is taken as the next record. For example, the regular expression ‘^.+$’, which matches lines with at least one character besides a newline, would make each such line into a sort record. See section Regular Expressions, for a description of the syntax and meaning of regular expressions.

The value of the key-regexp argument specifies what part of each record is the sort key. The key-regexp could match the whole record, or only a part. In the latter case, the rest of the record has no effect on the sorted order of records, but it is carried along when the record moves to its new position.

The key-regexp argument can refer to the text matched by a subexpression of record-regexp, or it can be a regular expression on its own.

If key-regexp is:

\digit

then the text matched by the digitth ‘\(...\)’ parenthesis grouping in record-regexp is the sort key.

\&

then the whole record is the sort key.

a regular expression

then sort-regexp-fields searches for a match for the regular expression within the record. If such a match is found, it is the sort key. If there is no match for key-regexp within a record then that record is ignored, which means its position in the buffer is not changed. (The other records may move around it.)

For example, if you plan to sort all the lines in the region by the first word on each line starting with the letter ‘f’, you should set record-regexp to ‘^.*$’ and set key-regexp to ‘\<f\w*\>’. The resulting expression looks like this:

(sort-regexp-fields nil "^.*$" "\\<f\\w*\\>"
                    (region-beginning)
                    (region-end))

If you call sort-regexp-fields interactively, it prompts for record-regexp and key-regexp in the minibuffer.

Command: sort-lines reverse start end

This command alphabetically sorts lines in the region between start and end. If reverse is non-nil, the sort is in reverse order.

Command: sort-paragraphs reverse start end

This command alphabetically sorts paragraphs in the region between start and end. If reverse is non-nil, the sort is in reverse order.

Command: sort-pages reverse start end

This command alphabetically sorts pages in the region between start and end. If reverse is non-nil, the sort is in reverse order.

Command: sort-fields field start end

This command sorts lines in the region between start and end, comparing them alphabetically by the fieldth field of each line. Fields are separated by whitespace and numbered starting from 1. If field is negative, sorting is by the -fieldth field from the end of the line. This command is useful for sorting tables.

Command: sort-numeric-fields field start end

This command sorts lines in the region between start and end, comparing them numerically by the fieldth field of each line. Fields are separated by whitespace and numbered starting from 1. The specified field must contain a number in each line of the region. Numbers starting with 0 are treated as octal, and numbers starting with ‘0x’ are treated as hexadecimal.

If field is negative, sorting is by the -fieldth field from the end of the line. This command is useful for sorting tables.

User Option: sort-numeric-base

This variable specifies the default radix for sort-numeric-fields to parse numbers.

Command: sort-columns reverse &optional beg end

This command sorts the lines in the region between beg and end, comparing them alphabetically by a certain range of columns. The column positions of beg and end bound the range of columns to sort on.

If reverse is non-nil, the sort is in reverse order.

One unusual thing about this command is that the entire line containing position beg, and the entire line containing position end, are included in the region sorted.

Note that sort-columns rejects text that contains tabs, because tabs could be split across the specified columns. Use M-x untabify to convert tabs to spaces before sorting.

When possible, this command actually works by calling the sort utility program.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.16 Counting Columns

The column functions convert between a character position (counting characters from the beginning of the buffer) and a column position (counting screen characters from the beginning of a line).

These functions count each character according to the number of columns it occupies on the screen. This means control characters count as occupying 2 or 4 columns, depending upon the value of ctl-arrow, and tabs count as occupying a number of columns that depends on the value of tab-width and on the column where the tab begins. See section Usual Display Conventions.

Column number computations ignore the width of the window and the amount of horizontal scrolling. Consequently, a column value can be arbitrarily high. The first (or leftmost) column is numbered 0. They also ignore overlays and text properties, aside from invisibility.

Function: current-column

This function returns the horizontal position of point, measured in columns, counting from 0 at the left margin. The column position is the sum of the widths of all the displayed representations of the characters between the start of the current line and point.

For an example of using current-column, see the description of count-lines in Motion by Text Lines.

Command: move-to-column column &optional force

This function moves point to column in the current line. The calculation of column takes into account the widths of the displayed representations of the characters between the start of the line and point.

When called interactively, column is the value of prefix numeric argument. If column is not an integer, an error is signaled.

If it is impossible to move to column column because that is in the middle of a multicolumn character such as a tab, point moves to the end of that character. However, if force is non-nil, and column is in the middle of a tab, then move-to-column converts the tab into spaces so that it can move precisely to column column. Other multicolumn characters can cause anomalies despite force, since there is no way to split them.

The argument force also has an effect if the line isn’t long enough to reach column column; if it is t, that means to add whitespace at the end of the line to reach that column.

The return value is the column number actually moved to.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17 Indentation

The indentation functions are used to examine, move to, and change whitespace that is at the beginning of a line. Some of the functions can also change whitespace elsewhere on a line. Columns and indentation count from zero at the left margin.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.1 Indentation Primitives

This section describes the primitive functions used to count and insert indentation. The functions in the following sections use these primitives. See section Size of Displayed Text, for related functions.

Function: current-indentation

This function returns the indentation of the current line, which is the horizontal position of the first nonblank character. If the contents are entirely blank, then this is the horizontal position of the end of the line.

Command: indent-to column &optional minimum

This function indents from point with tabs and spaces until column is reached. If minimum is specified and non-nil, then at least that many spaces are inserted even if this requires going beyond column. Otherwise the function does nothing if point is already beyond column. The value is the column at which the inserted indentation ends.

The inserted whitespace characters inherit text properties from the surrounding text (usually, from the preceding text only). See section Stickiness of Text Properties.

User Option: indent-tabs-mode

If this variable is non-nil, indentation functions can insert tabs as well as spaces. Otherwise, they insert only spaces. Setting this variable automatically makes it buffer-local in the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.2 Indentation Controlled by Major Mode

An important function of each major mode is to customize the TAB key to indent properly for the language being edited. This section describes the mechanism of the TAB key and how to control it. The functions in this section return unpredictable values.

Command: indent-for-tab-command &optional rigid

This is the command bound to TAB in most editing modes. Its usual action is to indent the current line, but it can alternatively insert a tab character or indent a region.

Here is what it does:

If rigid is non-nil (interactively, with a prefix argument), then after this command indents a line or inserts a tab, it also rigidly indents the entire balanced expression which starts at the beginning of the current line, in order to reflect the new indentation. This argument is ignored if the command indents the region.

Variable: indent-line-function

This variable’s value is the function to be used by indent-for-tab-command, and various other indentation commands, to indent the current line. It is usually assigned by the major mode; for instance, Lisp mode sets it to lisp-indent-line, C mode sets it to c-indent-line, and so on. The default value is indent-relative. See section Automatic Indentation of code.

Command: indent-according-to-mode

This command calls the function in indent-line-function to indent the current line in a way appropriate for the current major mode.

Command: newline-and-indent

This function inserts a newline, then indents the new line (the one following the newline just inserted) according to the major mode. It does indentation by calling indent-according-to-mode.

Command: reindent-then-newline-and-indent

This command reindents the current line, inserts a newline at point, and then indents the new line (the one following the newline just inserted). It does indentation on both lines by calling indent-according-to-mode.

User Option: tab-always-indent

This variable can be used to customize the behavior of the TAB (indent-for-tab-command) command. If the value is t (the default), the command normally just indents the current line. If the value is nil, the command indents the current line only if point is at the left margin or in the line’s indentation; otherwise, it inserts a tab character. If the value is complete, the command first tries to indent the current line, and if the line was already indented, it calls completion-at-point to complete the text at point (see section Completion in Ordinary Buffers).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.3 Indenting an Entire Region

This section describes commands that indent all the lines in the region. They return unpredictable values.

Command: indent-region start end &optional to-column

This command indents each nonblank line starting between start (inclusive) and end (exclusive). If to-column is nil, indent-region indents each nonblank line by calling the current mode’s indentation function, the value of indent-line-function.

If to-column is non-nil, it should be an integer specifying the number of columns of indentation; then this function gives each line exactly that much indentation, by either adding or deleting whitespace.

If there is a fill prefix, indent-region indents each line by making it start with the fill prefix.

Variable: indent-region-function

The value of this variable is a function that can be used by indent-region as a short cut. It should take two arguments, the start and end of the region. You should design the function so that it will produce the same results as indenting the lines of the region one by one, but presumably faster.

If the value is nil, there is no short cut, and indent-region actually works line by line.

A short-cut function is useful in modes such as C mode and Lisp mode, where the indent-line-function must scan from the beginning of the function definition: applying it to each line would be quadratic in time. The short cut can update the scan information as it moves through the lines indenting them; this takes linear time. In a mode where indenting a line individually is fast, there is no need for a short cut.

indent-region with a non-nil argument to-column has a different meaning and does not use this variable.

Command: indent-rigidly start end count

This function indents all lines starting between start (inclusive) and end (exclusive) sideways by count columns. This “preserves the shape” of the affected region, moving it as a rigid unit.

This is useful not only for indenting regions of unindented text, but also for indenting regions of formatted code. For example, if count is 3, this command adds 3 columns of indentation to every line that begins in the specified region.

If called interactively with no prefix argument, this command invokes a transient mode for adjusting indentation rigidly. See Indentation Commands in The GNU Emacs Manual.

Command: indent-code-rigidly start end columns &optional nochange-regexp

This is like indent-rigidly, except that it doesn’t alter lines that start within strings or comments.

In addition, it doesn’t alter a line if nochange-regexp matches at the beginning of the line (if nochange-regexp is non-nil).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.4 Indentation Relative to Previous Lines

This section describes two commands that indent the current line based on the contents of previous lines.

Command: indent-relative &optional unindented-ok

This command inserts whitespace at point, extending to the same column as the next indent point of the previous nonblank line. An indent point is a non-whitespace character following whitespace. The next indent point is the first one at a column greater than the current column of point. For example, if point is underneath and to the left of the first non-blank character of a line of text, it moves to that column by inserting whitespace.

If the previous nonblank line has no next indent point (i.e., none at a great enough column position), indent-relative either does nothing (if unindented-ok is non-nil) or calls tab-to-tab-stop. Thus, if point is underneath and to the right of the last column of a short line of text, this command ordinarily moves point to the next tab stop by inserting whitespace.

The return value of indent-relative is unpredictable.

In the following example, point is at the beginning of the second line:

            This line is indented twelve spaces.
∗The quick brown fox jumped.

Evaluation of the expression (indent-relative nil) produces the following:

            This line is indented twelve spaces.
            ∗The quick brown fox jumped.

In this next example, point is between the ‘m’ and ‘p’ of ‘jumped’:

            This line is indented twelve spaces.
The quick brown fox jum∗ped.

Evaluation of the expression (indent-relative nil) produces the following:

            This line is indented twelve spaces.
The quick brown fox jum  ∗ped.
Command: indent-relative-maybe

This command indents the current line like the previous nonblank line, by calling indent-relative with t as the unindented-ok argument. The return value is unpredictable.

If the previous nonblank line has no indent points beyond the current column, this command does nothing.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.5 Adjustable “Tab Stops”

This section explains the mechanism for user-specified “tab stops” and the mechanisms that use and set them. The name “tab stops” is used because the feature is similar to that of the tab stops on a typewriter. The feature works by inserting an appropriate number of spaces and tab characters to reach the next tab stop column; it does not affect the display of tab characters in the buffer (see section Usual Display Conventions). Note that the TAB character as input uses this tab stop feature only in a few major modes, such as Text mode. See Tab Stops in The GNU Emacs Manual.

Command: tab-to-tab-stop

This command inserts spaces or tabs before point, up to the next tab stop column defined by tab-stop-list.

User Option: tab-stop-list

This variable defines the tab stop columns used by tab-to-tab-stop. It should be either nil, or a list of increasing integers, which need not be evenly spaced. The list is implicitly extended to infinity through repetition of the interval between the last and penultimate elements (or tab-width if the list has fewer than two elements). A value of nil means a tab stop every tab-width columns.

Use M-x edit-tab-stops to edit the location of tab stops interactively.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.6 Indentation-Based Motion Commands

These commands, primarily for interactive use, act based on the indentation in the text.

Command: back-to-indentation

This command moves point to the first non-whitespace character in the current line (which is the line in which point is located). It returns nil.

Command: backward-to-indentation &optional arg

This command moves point backward arg lines and then to the first nonblank character on that line. It returns nil. If arg is omitted or nil, it defaults to 1.

Command: forward-to-indentation &optional arg

This command moves point forward arg lines and then to the first nonblank character on that line. It returns nil. If arg is omitted or nil, it defaults to 1.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.18 Case Changes

The case change commands described here work on text in the current buffer. See section Case Conversion in Lisp, for case conversion functions that work on strings and characters. See section The Case Table, for how to customize which characters are upper or lower case and how to convert them.

Command: capitalize-region start end

This function capitalizes all words in the region defined by start and end. To capitalize means to convert each word’s first character to upper case and convert the rest of each word to lower case. The function returns nil.

If one end of the region is in the middle of a word, the part of the word within the region is treated as an entire word.

When capitalize-region is called interactively, start and end are point and the mark, with the smallest first.

---------- Buffer: foo ----------
This is the contents of the 5th foo.
---------- Buffer: foo ----------
(capitalize-region 1 37)
⇒ nil

---------- Buffer: foo ----------
This Is The Contents Of The 5th Foo.
---------- Buffer: foo ----------
Command: downcase-region start end

This function converts all of the letters in the region defined by start and end to lower case. The function returns nil.

When downcase-region is called interactively, start and end are point and the mark, with the smallest first.

Command: upcase-region start end

This function converts all of the letters in the region defined by start and end to upper case. The function returns nil.

When upcase-region is called interactively, start and end are point and the mark, with the smallest first.

Command: capitalize-word count

This function capitalizes count words after point, moving point over as it does. To capitalize means to convert each word’s first character to upper case and convert the rest of each word to lower case. If count is negative, the function capitalizes the -count previous words but does not move point. The value is nil.

If point is in the middle of a word, the part of the word before point is ignored when moving forward. The rest is treated as an entire word.

When capitalize-word is called interactively, count is set to the numeric prefix argument.

Command: downcase-word count

This function converts the count words after point to all lower case, moving point over as it does. If count is negative, it converts the -count previous words but does not move point. The value is nil.

When downcase-word is called interactively, count is set to the numeric prefix argument.

Command: upcase-word count

This function converts the count words after point to all upper case, moving point over as it does. If count is negative, it converts the -count previous words but does not move point. The value is nil.

When upcase-word is called interactively, count is set to the numeric prefix argument.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19 Text Properties

Each character position in a buffer or a string can have a text property list, much like the property list of a symbol (see section Property Lists). The properties belong to a particular character at a particular place, such as, the letter ‘T’ at the beginning of this sentence or the first ‘o’ in ‘foo’—if the same character occurs in two different places, the two occurrences in general have different properties.

Each property has a name and a value. Both of these can be any Lisp object, but the name is normally a symbol. Typically each property name symbol is used for a particular purpose; for instance, the text property face specifies the faces for displaying the character (see section Properties with Special Meanings). The usual way to access the property list is to specify a name and ask what value corresponds to it.

If a character has a category property, we call it the property category of the character. It should be a symbol. The properties of the symbol serve as defaults for the properties of the character.

Copying text between strings and buffers preserves the properties along with the characters; this includes such diverse functions as substring, insert, and buffer-substring.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.1 Examining Text Properties

The simplest way to examine text properties is to ask for the value of a particular property of a particular character. For that, use get-text-property. Use text-properties-at to get the entire property list of a character. See section Text Property Search Functions, for functions to examine the properties of a number of characters at once.

These functions handle both strings and buffers. Keep in mind that positions in a string start from 0, whereas positions in a buffer start from 1.

Function: get-text-property pos prop &optional object

This function returns the value of the prop property of the character after position pos in object (a buffer or string). The argument object is optional and defaults to the current buffer.

If there is no prop property strictly speaking, but the character has a property category that is a symbol, then get-text-property returns the prop property of that symbol.

Function: get-char-property position prop &optional object

This function is like get-text-property, except that it checks overlays first and then text properties. See section Overlays.

The argument object may be a string, a buffer, or a window. If it is a window, then the buffer displayed in that window is used for text properties and overlays, but only the overlays active for that window are considered. If object is a buffer, then overlays in that buffer are considered first, in order of decreasing priority, followed by the text properties. If object is a string, only text properties are considered, since strings never have overlays.

Function: get-pos-property position prop &optional object

This function is like get-char-property, except that it pays attention to properties’ stickiness and overlays’ advancement settings instead of the property of the character at (i.e. right after) position.

Function: get-char-property-and-overlay position prop &optional object

This is like get-char-property, but gives extra information about the overlay that the property value comes from.

Its value is a cons cell whose CAR is the property value, the same value get-char-property would return with the same arguments. Its CDR is the overlay in which the property was found, or nil, if it was found as a text property or not found at all.

If position is at the end of object, both the CAR and the CDR of the value are nil.

Variable: char-property-alias-alist

This variable holds an alist which maps property names to a list of alternative property names. If a character does not specify a direct value for a property, the alternative property names are consulted in order; the first non-nil value is used. This variable takes precedence over default-text-properties, and category properties take precedence over this variable.

Function: text-properties-at position &optional object

This function returns the entire property list of the character at position in the string or buffer object. If object is nil, it defaults to the current buffer.

Variable: default-text-properties

This variable holds a property list giving default values for text properties. Whenever a character does not specify a value for a property, neither directly, through a category symbol, or through char-property-alias-alist, the value stored in this list is used instead. Here is an example:

(setq default-text-properties '(foo 69)
      char-property-alias-alist nil)
;; Make sure character 1 has no properties of its own.
(set-text-properties 1 2 nil)
;; What we get, when we ask, is the default value.
(get-text-property 1 'foo)
     ⇒ 69

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.2 Changing Text Properties

The primitives for changing properties apply to a specified range of text in a buffer or string. The function set-text-properties (see end of section) sets the entire property list of the text in that range; more often, it is useful to add, change, or delete just certain properties specified by name.

Since text properties are considered part of the contents of the buffer (or string), and can affect how a buffer looks on the screen, any change in buffer text properties marks the buffer as modified. Buffer text property changes are undoable also (see section Undo). Positions in a string start from 0, whereas positions in a buffer start from 1.

Function: put-text-property start end prop value &optional object

This function sets the prop property to value for the text between start and end in the string or buffer object. If object is nil, it defaults to the current buffer.

Function: add-text-properties start end props &optional object

This function adds or overrides text properties for the text between start and end in the string or buffer object. If object is nil, it defaults to the current buffer.

The argument props specifies which properties to add. It should have the form of a property list (see section Property Lists): a list whose elements include the property names followed alternately by the corresponding values.

The return value is t if the function actually changed some property’s value; nil otherwise (if props is nil or its values agree with those in the text).

For example, here is how to set the comment and face properties of a range of text:

(add-text-properties start end
                     '(comment t face highlight))
Function: remove-text-properties start end props &optional object

This function deletes specified text properties from the text between start and end in the string or buffer object. If object is nil, it defaults to the current buffer.

The argument props specifies which properties to delete. It should have the form of a property list (see section Property Lists): a list whose elements are property names alternating with corresponding values. But only the names matter—the values that accompany them are ignored. For example, here’s how to remove the face property.

(remove-text-properties start end '(face nil))

The return value is t if the function actually changed some property’s value; nil otherwise (if props is nil or if no character in the specified text had any of those properties).

To remove all text properties from certain text, use set-text-properties and specify nil for the new property list.

Function: remove-list-of-text-properties start end list-of-properties &optional object

Like remove-text-properties except that list-of-properties is a list of property names only, not an alternating list of property names and values.

Function: set-text-properties start end props &optional object

This function completely replaces the text property list for the text between start and end in the string or buffer object. If object is nil, it defaults to the current buffer.

The argument props is the new property list. It should be a list whose elements are property names alternating with corresponding values.

After set-text-properties returns, all the characters in the specified range have identical properties.

If props is nil, the effect is to get rid of all properties from the specified range of text. Here’s an example:

(set-text-properties start end nil)

Do not rely on the return value of this function.

Function: add-face-text-property start end face &optional appendp object

This function acts on the text between start and end, adding the face face to the face text property. face should be a valid value for the face property (see section Properties with Special Meanings), such as a face name or an anonymous face (see section Faces).

If any text in the region already has a non-nil face property, those face(s) are retained. This function sets the face property to a list of faces, with face as the first element (by default) and the pre-existing faces as the remaining elements. If the optional argument append is non-nil, face is appended to the end of the list instead. Note that in a face list, the first occurring value for each attribute takes precedence.

For example, the following code would assign a italicized green face to the text between start and end:

(add-face-text-property start end 'italic)
(add-face-text-property start end '(:foreground "red"))
(add-face-text-property start end '(:foreground "green"))

The optional argument object, if non-nil, specifies a buffer or string to act on, rather than the current buffer. If object is a string, then start and end are zero-based indices into the string.

The easiest way to make a string with text properties is with propertize:

Function: propertize string &rest properties

This function returns a copy of string with the text properties properties added. These properties apply to all the characters in the string that is returned. Here is an example that constructs a string with a face property and a mouse-face property:

(propertize "foo" 'face 'italic
            'mouse-face 'bold-italic)
     ⇒ #("foo" 0 3 (mouse-face bold-italic face italic))

To put different properties on various parts of a string, you can construct each part with propertize and then combine them with concat:

(concat
 (propertize "foo" 'face 'italic
             'mouse-face 'bold-italic)
 " and "
 (propertize "bar" 'face 'italic
             'mouse-face 'bold-italic))
     ⇒ #("foo and bar"
                 0 3 (face italic mouse-face bold-italic)
                 3 8 nil
                 8 11 (face italic mouse-face bold-italic))

See section Examining Buffer Contents, for the function buffer-substring-no-properties, which copies text from the buffer but does not copy its properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.3 Text Property Search Functions

In typical use of text properties, most of the time several or many consecutive characters have the same value for a property. Rather than writing your programs to examine characters one by one, it is much faster to process chunks of text that have the same property value.

Here are functions you can use to do this. They use eq for comparing property values. In all cases, object defaults to the current buffer.

For good performance, it’s very important to use the limit argument to these functions, especially the ones that search for a single property—otherwise, they may spend a long time scanning to the end of the buffer, if the property you are interested in does not change.

These functions do not move point; instead, they return a position (or nil). Remember that a position is always between two characters; the position returned by these functions is between two characters with different properties.

Function: next-property-change pos &optional object limit

The function scans the text forward from position pos in the string or buffer object until it finds a change in some text property, then returns the position of the change. In other words, it returns the position of the first character beyond pos whose properties are not identical to those of the character just after pos.

If limit is non-nil, then the scan ends at position limit. If there is no property change before that point, this function returns limit.

The value is nil if the properties remain unchanged all the way to the end of object and limit is nil. If the value is non-nil, it is a position greater than or equal to pos. The value equals pos only when limit equals pos.

Here is an example of how to scan the buffer by chunks of text within which all properties are constant:

(while (not (eobp))
  (let ((plist (text-properties-at (point)))
        (next-change
         (or (next-property-change (point) (current-buffer))
             (point-max))))
    Process text from point to next-change
    (goto-char next-change)))
Function: previous-property-change pos &optional object limit

This is like next-property-change, but scans back from pos instead of forward. If the value is non-nil, it is a position less than or equal to pos; it equals pos only if limit equals pos.

Function: next-single-property-change pos prop &optional object limit

The function scans text for a change in the prop property, then returns the position of the change. The scan goes forward from position pos in the string or buffer object. In other words, this function returns the position of the first character beyond pos whose prop property differs from that of the character just after pos.

If limit is non-nil, then the scan ends at position limit. If there is no property change before that point, next-single-property-change returns limit.

The value is nil if the property remains unchanged all the way to the end of object and limit is nil. If the value is non-nil, it is a position greater than or equal to pos; it equals pos only if limit equals pos.

Function: previous-single-property-change pos prop &optional object limit

This is like next-single-property-change, but scans back from pos instead of forward. If the value is non-nil, it is a position less than or equal to pos; it equals pos only if limit equals pos.

Function: next-char-property-change pos &optional limit

This is like next-property-change except that it considers overlay properties as well as text properties, and if no change is found before the end of the buffer, it returns the maximum buffer position rather than nil (in this sense, it resembles the corresponding overlay function next-overlay-change, rather than next-property-change). There is no object operand because this function operates only on the current buffer. It returns the next address at which either kind of property changes.

Function: previous-char-property-change pos &optional limit

This is like next-char-property-change, but scans back from pos instead of forward, and returns the minimum buffer position if no change is found.

Function: next-single-char-property-change pos prop &optional object limit

This is like next-single-property-change except that it considers overlay properties as well as text properties, and if no change is found before the end of the object, it returns the maximum valid position in object rather than nil. Unlike next-char-property-change, this function does have an object operand; if object is not a buffer, only text-properties are considered.

Function: previous-single-char-property-change pos prop &optional object limit

This is like next-single-char-property-change, but scans back from pos instead of forward, and returns the minimum valid position in object if no change is found.

Function: text-property-any start end prop value &optional object

This function returns non-nil if at least one character between start and end has a property prop whose value is value. More precisely, it returns the position of the first such character. Otherwise, it returns nil.

The optional fifth argument, object, specifies the string or buffer to scan. Positions are relative to object. The default for object is the current buffer.

Function: text-property-not-all start end prop value &optional object

This function returns non-nil if at least one character between start and end does not have a property prop with value value. More precisely, it returns the position of the first such character. Otherwise, it returns nil.

The optional fifth argument, object, specifies the string or buffer to scan. Positions are relative to object. The default for object is the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.4 Properties with Special Meanings

Here is a table of text property names that have special built-in meanings. The following sections list a few additional special property names that control filling and property inheritance. All other names have no standard meaning, and you can use them as you like.

Note: the properties composition, display, invisible and intangible can also cause point to move to an acceptable place, after each Emacs command. See section Adjusting Point After Commands.

category

If a character has a category property, we call it the property category of the character. It should be a symbol. The properties of this symbol serve as defaults for the properties of the character.

face

The face property controls the appearance of the character (see section Faces). The value of the property can be the following:

Font Lock mode (see section Font Lock Mode) works in most buffers by dynamically updating the face property of characters based on the context.

The add-face-text-property function provides a convenient way to set this text property. See section Changing Text Properties.

font-lock-face

This property specifies a value for the face property that Font Lock mode should apply to the underlying text. It is one of the fontification methods used by Font Lock mode, and is useful for special modes that implement their own highlighting. See section Precalculated Fontification. When Font Lock mode is disabled, font-lock-face has no effect.

mouse-face

This property is used instead of face when the mouse is on or near the character. For this purpose, “near” means that all text between the character and where the mouse is have the same mouse-face property value.

Emacs ignores all face attributes from the mouse-face property that alter the text size (e.g., :height, :weight, and :slant). Those attributes are always the same as for the unhighlighted text.

fontified

This property says whether the text is ready for display. If nil, Emacs’s redisplay routine calls the functions in fontification-functions (see section Automatic Face Assignment) to prepare this part of the buffer before it is displayed. It is used internally by the “just in time” font locking code.

display

This property activates various features that change the way text is displayed. For example, it can make text appear taller or shorter, higher or lower, wider or narrow, or replaced with an image. See section The display Property.

help-echo

If text has a string as its help-echo property, then when you move the mouse onto that text, Emacs displays that string in the echo area, or in the tooltip window (see Tooltips in The GNU Emacs Manual).

If the value of the help-echo property is a function, that function is called with three arguments, window, object and pos and should return a help string or nil for none. The first argument, window is the window in which the help was found. The second, object, is the buffer, overlay or string which had the help-echo property. The pos argument is as follows:

If the value of the help-echo property is neither a function nor a string, it is evaluated to obtain a help string.

You can alter the way help text is displayed by setting the variable show-help-function (see Help display).

This feature is used in the mode line and for other active text.

keymap

The keymap property specifies an additional keymap for commands. When this keymap applies, it is used for key lookup before the minor mode keymaps and before the buffer’s local map. See section Active Keymaps. If the property value is a symbol, the symbol’s function definition is used as the keymap.

The property’s value for the character before point applies if it is non-nil and rear-sticky, and the property’s value for the character after point applies if it is non-nil and front-sticky. (For mouse clicks, the position of the click is used instead of the position of point.)

local-map

This property works like keymap except that it specifies a keymap to use instead of the buffer’s local map. For most purposes (perhaps all purposes), it is better to use the keymap property.

syntax-table

The syntax-table property overrides what the syntax table says about this particular character. See section Syntax Properties.

read-only

If a character has the property read-only, then modifying that character is not allowed. Any command that would do so gets an error, text-read-only. If the property value is a string, that string is used as the error message.

Insertion next to a read-only character is an error if inserting ordinary text there would inherit the read-only property due to stickiness. Thus, you can control permission to insert next to read-only text by controlling the stickiness. See section Stickiness of Text Properties.

Since changing properties counts as modifying the buffer, it is not possible to remove a read-only property unless you know the special trick: bind inhibit-read-only to a non-nil value and then remove the property. See section Read-Only Buffers.

invisible

A non-nil invisible property can make a character invisible on the screen. See section Invisible Text, for details.

intangible

If a group of consecutive characters have equal and non-nil intangible properties, then you cannot place point between them. If you try to move point forward into the group, point actually moves to the end of the group. If you try to move point backward into the group, point actually moves to the start of the group.

If consecutive characters have unequal non-nil intangible properties, they belong to separate groups; each group is separately treated as described above.

When the variable inhibit-point-motion-hooks is non-nil, the intangible property is ignored.

Beware: this property operates at a very low level, and affects a lot of code in unexpected ways. So use it with extreme caution. A common misuse is to put an intangible property on invisible text, which is actually unnecessary since the command loop will move point outside of the invisible text at the end of each command anyway. See section Adjusting Point After Commands.

field

Consecutive characters with the same field property constitute a field. Some motion functions including forward-word and beginning-of-line stop moving at a field boundary. See section Defining and Using Fields.

cursor

Normally, the cursor is displayed at the beginning or the end of any overlay and text property strings present at the current buffer position. You can place the cursor on any desired character of these strings by giving that character a non-nil cursor text property. In addition, if the value of the cursor property is an integer, it specifies the number of buffer’s character positions, starting with the position where the overlay or the display property begins, for which the cursor should be displayed on that character. Specifically, if the value of the cursor property of a character is the number n, the cursor will be displayed on this character for any buffer position in the range [ovpos..ovpos+n), where ovpos is the overlay’s starting position given by overlay-start (see section Managing Overlays), or the position where the display text property begins in the buffer.

In other words, the string character with the cursor property of any non-nil value is the character where to display the cursor. The value of the property says for which buffer positions to display the cursor there. If the value is an integer n, the cursor is displayed there when point is anywhere between the beginning of the overlay or display property and n positions after that. If the value is anything else and non-nil, the cursor is displayed there only when point is at the beginning of the display property or at overlay-start.

When the buffer has many overlay strings (e.g., see section before-string) or display properties that are strings, it is a good idea to use the cursor property on these strings to cue the Emacs display about the places where to put the cursor while traversing these strings. This directly communicates to the display engine where the Lisp program wants to put the cursor, or where the user would expect the cursor.

pointer

This specifies a specific pointer shape when the mouse pointer is over this text or image. See section Pointer Shape, for possible pointer shapes.

line-spacing

A newline can have a line-spacing text or overlay property that controls the height of the display line ending with that newline. The property value overrides the default frame line spacing and the buffer local line-spacing variable. See section Line Height.

line-height

A newline can have a line-height text or overlay property that controls the total height of the display line ending in that newline. See section Line Height.

wrap-prefix

If text has a wrap-prefix property, the prefix it defines will be added at display time to the beginning of every continuation line due to text wrapping (so if lines are truncated, the wrap-prefix is never used). It may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the :width or :align-to display properties (see section Specified Spaces).

A wrap-prefix may also be specified for an entire buffer using the wrap-prefix buffer-local variable (however, a wrap-prefix text-property takes precedence over the value of the wrap-prefix variable). See section Truncation.

line-prefix

If text has a line-prefix property, the prefix it defines will be added at display time to the beginning of every non-continuation line. It may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the :width or :align-to display properties (see section Specified Spaces).

A line-prefix may also be specified for an entire buffer using the line-prefix buffer-local variable (however, a line-prefix text-property takes precedence over the value of the line-prefix variable). See section Truncation.

modification-hooks

If a character has the property modification-hooks, then its value should be a list of functions; modifying that character calls all of those functions before the actual modification. Each function receives two arguments: the beginning and end of the part of the buffer being modified. Note that if a particular modification hook function appears on several characters being modified by a single primitive, you can’t predict how many times the function will be called. Furthermore, insertion will not modify any existing character, so this hook will only be run when removing some characters, replacing them with others, or changing their text-properties.

If these functions modify the buffer, they should bind inhibit-modification-hooks to t around doing so, to avoid confusing the internal mechanism that calls these hooks.

Overlays also support the modification-hooks property, but the details are somewhat different (see section Overlay Properties).

insert-in-front-hooks
insert-behind-hooks

The operation of inserting text in a buffer also calls the functions listed in the insert-in-front-hooks property of the following character and in the insert-behind-hooks property of the preceding character. These functions receive two arguments, the beginning and end of the inserted text. The functions are called after the actual insertion takes place.

See also Change Hooks, for other hooks that are called when you change text in a buffer.

point-entered
point-left

The special properties point-entered and point-left record hook functions that report motion of point. Each time point moves, Emacs compares these two property values:

If these two values differ, each of them is called (if not nil) with two arguments: the old value of point, and the new one.

The same comparison is made for the characters before the old and new locations. The result may be to execute two point-left functions (which may be the same function) and/or two point-entered functions (which may be the same function). In any case, all the point-left functions are called first, followed by all the point-entered functions.

It is possible to use char-after to examine characters at various buffer positions without moving point to those positions. Only an actual change in the value of point runs these hook functions.

The variable inhibit-point-motion-hooks can inhibit running the point-left and point-entered hooks, see Inhibit point motion hooks.

composition

This text property is used to display a sequence of characters as a single glyph composed from components. But the value of the property itself is completely internal to Emacs and should not be manipulated directly by, for instance, put-text-property.

Variable: inhibit-point-motion-hooks

When this variable is non-nil, point-left and point-entered hooks are not run, and the intangible property has no effect. Do not set this variable globally; bind it with let.

Variable: show-help-function

If this variable is non-nil, it specifies a function called to display help strings. These may be help-echo properties, menu help strings (see section Simple Menu Items, see section Extended Menu Items), or tool bar help strings (see section Tool bars). The specified function is called with one argument, the help string to display. Tooltip mode (see Tooltips in The GNU Emacs Manual) provides an example.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.5 Formatted Text Properties

These text properties affect the behavior of the fill commands. They are used for representing formatted text. See section Filling, and Margins for Filling.

hard

If a newline character has this property, it is a “hard” newline. The fill commands do not alter hard newlines and do not move words across them. However, this property takes effect only if the use-hard-newlines minor mode is enabled. See Hard and Soft Newlines in The GNU Emacs Manual.

right-margin

This property specifies an extra right margin for filling this part of the text.

left-margin

This property specifies an extra left margin for filling this part of the text.

justification

This property specifies the style of justification for filling this part of the text.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.6 Stickiness of Text Properties

Self-inserting characters normally take on the same properties as the preceding character. This is called inheritance of properties.

A Lisp program can do insertion with inheritance or without, depending on the choice of insertion primitive. The ordinary text insertion functions, such as insert, do not inherit any properties. They insert text with precisely the properties of the string being inserted, and no others. This is correct for programs that copy text from one context to another—for example, into or out of the kill ring. To insert with inheritance, use the special primitives described in this section. Self-inserting characters inherit properties because they work using these primitives.

When you do insertion with inheritance, which properties are inherited, and from where, depends on which properties are sticky. Insertion after a character inherits those of its properties that are rear-sticky. Insertion before a character inherits those of its properties that are front-sticky. When both sides offer different sticky values for the same property, the previous character’s value takes precedence.

By default, a text property is rear-sticky but not front-sticky; thus, the default is to inherit all the properties of the preceding character, and nothing from the following character.

You can control the stickiness of various text properties with two specific text properties, front-sticky and rear-nonsticky, and with the variable text-property-default-nonsticky. You can use the variable to specify a different default for a given property. You can use those two text properties to make any specific properties sticky or nonsticky in any particular part of the text.

If a character’s front-sticky property is t, then all its properties are front-sticky. If the front-sticky property is a list, then the sticky properties of the character are those whose names are in the list. For example, if a character has a front-sticky property whose value is (face read-only), then insertion before the character can inherit its face property and its read-only property, but no others.

The rear-nonsticky property works the opposite way. Most properties are rear-sticky by default, so the rear-nonsticky property says which properties are not rear-sticky. If a character’s rear-nonsticky property is t, then none of its properties are rear-sticky. If the rear-nonsticky property is a list, properties are rear-sticky unless their names are in the list.

Variable: text-property-default-nonsticky

This variable holds an alist which defines the default rear-stickiness of various text properties. Each element has the form (property . nonstickiness), and it defines the stickiness of a particular text property, property.

If nonstickiness is non-nil, this means that the property property is rear-nonsticky by default. Since all properties are front-nonsticky by default, this makes property nonsticky in both directions by default.

The text properties front-sticky and rear-nonsticky, when used, take precedence over the default nonstickiness specified in text-property-default-nonsticky.

Here are the functions that insert text with inheritance of properties:

Function: insert-and-inherit &rest strings

Insert the strings strings, just like the function insert, but inherit any sticky properties from the adjoining text.

Function: insert-before-markers-and-inherit &rest strings

Insert the strings strings, just like the function insert-before-markers, but inherit any sticky properties from the adjoining text.

See section Inserting Text, for the ordinary insertion functions which do not inherit.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.7 Lazy Computation of Text Properties

Instead of computing text properties for all the text in the buffer, you can arrange to compute the text properties for parts of the text when and if something depends on them.

The primitive that extracts text from the buffer along with its properties is buffer-substring. Before examining the properties, this function runs the abnormal hook buffer-access-fontify-functions.

Variable: buffer-access-fontify-functions

This variable holds a list of functions for computing text properties. Before buffer-substring copies the text and text properties for a portion of the buffer, it calls all the functions in this list. Each of the functions receives two arguments that specify the range of the buffer being accessed. (The buffer itself is always the current buffer.)

The function buffer-substring-no-properties does not call these functions, since it ignores text properties anyway.

In order to prevent the hook functions from being called more than once for the same part of the buffer, you can use the variable buffer-access-fontified-property.

Variable: buffer-access-fontified-property

If this variable’s value is non-nil, it is a symbol which is used as a text property name. A non-nil value for that text property means, “the other text properties for this character have already been computed”.

If all the characters in the range specified for buffer-substring have a non-nil value for this property, buffer-substring does not call the buffer-access-fontify-functions functions. It assumes these characters already have the right text properties, and just copies the properties they already have.

The normal way to use this feature is that the buffer-access-fontify-functions functions add this property, as well as others, to the characters they operate on. That way, they avoid being called over and over for the same text.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.8 Defining Clickable Text

Clickable text is text that can be clicked, with either the mouse or via a keyboard command, to produce some result. Many major modes use clickable text to implement textual hyper-links, or links for short.

The easiest way to insert and manipulate links is to use the button package. See section Buttons. In this section, we will explain how to manually set up clickable text in a buffer, using text properties. For simplicity, we will refer to the clickable text as a link.

Implementing a link involves three separate steps: (1) indicating clickability when the mouse moves over the link; (2) making RET or Mouse-2 on that link do something; and (3) setting up a follow-link condition so that the link obeys mouse-1-click-follows-link.

To indicate clickability, add the mouse-face text property to the text of the link; then Emacs will highlight the link when the mouse moves over it. In addition, you should define a tooltip or echo area message, using the help-echo text property. See section Properties with Special Meanings. For instance, here is how Dired indicates that file names are clickable:

 (if (dired-move-to-filename)
     (add-text-properties
       (point)
       (save-excursion
         (dired-move-to-end-of-filename)
         (point))
       '(mouse-face highlight
         help-echo "mouse-2: visit this file in other window")))

To make the link clickable, bind RET and Mouse-2 to commands that perform the desired action. Each command should check to see whether it was called on a link, and act accordingly. For instance, Dired’s major mode keymap binds Mouse-2 to the following command:

(defun dired-mouse-find-file-other-window (event)
  "In Dired, visit the file or directory name you click on."
  (interactive "e")
  (let ((window (posn-window (event-end event)))
        (pos (posn-point (event-end event)))
        file)
    (if (not (windowp window))
        (error "No file chosen"))
    (with-current-buffer (window-buffer window)
      (goto-char pos)
      (setq file (dired-get-file-for-visit)))
    (if (file-directory-p file)
        (or (and (cdr dired-subdir-alist)
                 (dired-goto-subdir file))
            (progn
              (select-window window)
              (dired-other-window file)))
      (select-window window)
      (find-file-other-window (file-name-sans-versions file t)))))

This command uses the functions posn-window and posn-point to determine where the click occurred, and dired-get-file-for-visit to determine which file to visit.

Instead of binding the mouse command in a major mode keymap, you can bind it within the link text, using the keymap text property (see section Properties with Special Meanings). For instance:

(let ((map (make-sparse-keymap)))
  (define-key map [mouse-2] 'operate-this-button)
  (put-text-property link-start link-end 'keymap map))

With this method, you can easily define different commands for different links. Furthermore, the global definition of RET and Mouse-2 remain available for the rest of the text in the buffer.

The basic Emacs command for clicking on links is Mouse-2. However, for compatibility with other graphical applications, Emacs also recognizes Mouse-1 clicks on links, provided the user clicks on the link quickly without moving the mouse. This behavior is controlled by the user option mouse-1-click-follows-link. See Mouse References in The GNU Emacs Manual.

To set up the link so that it obeys mouse-1-click-follows-link, you must either (1) apply a follow-link text or overlay property to the link text, or (2) bind the follow-link event to a keymap (which can be a major mode keymap or a local keymap specified via the keymap text property). The value of the follow-link property, or the binding for the follow-link event, acts as a “condition” for the link action. This condition tells Emacs two things: the circumstances under which a Mouse-1 click should be regarded as occurring “inside” the link, and how to compute an “action code” that says what to translate the Mouse-1 click into. The link action condition can be one of the following:

mouse-face

If the condition is the symbol mouse-face, a position is inside a link if there is a non-nil mouse-face property at that position. The action code is always t.

For example, here is how Info mode handles Mouse-1:

(define-key Info-mode-map [follow-link] 'mouse-face)
a function

If the condition is a function, func, then a position pos is inside a link if (func pos) evaluates to non-nil. The value returned by func serves as the action code.

For example, here is how pcvs enables Mouse-1 to follow links on file names only:

(define-key map [follow-link]
  (lambda (pos)
    (eq (get-char-property pos 'face) 'cvs-filename-face)))
anything else

If the condition value is anything else, then the position is inside a link and the condition itself is the action code. Clearly, you should specify this kind of condition only when applying the condition via a text or property overlay on the link text (so that it does not apply to the entire buffer).

The action code tells Mouse-1 how to follow the link:

a string or vector

If the action code is a string or vector, the Mouse-1 event is translated into the first element of the string or vector; i.e., the action of the Mouse-1 click is the local or global binding of that character or symbol. Thus, if the action code is "foo", Mouse-1 translates into f. If it is [foo], Mouse-1 translates into foo.

anything else

For any other non-nil action code, the Mouse-1 event is translated into a Mouse-2 event at the same position.

To define Mouse-1 to activate a button defined with define-button-type, give the button a follow-link property. The property value should be a link action condition, as described above. See section Buttons. For example, here is how Help mode handles Mouse-1:

(define-button-type 'help-xref
  'follow-link t
  'action #'help-button-action)

To define Mouse-1 on a widget defined with define-widget, give the widget a :follow-link property. The property value should be a link action condition, as described above. For example, here is how the link widget specifies that a Mouse-1 click shall be translated to RET:

(define-widget 'link 'item
  "An embedded link."
  :button-prefix 'widget-link-prefix
  :button-suffix 'widget-link-suffix
  :follow-link "\C-m"
  :help-echo "Follow the link."
  :format "%[%t%]")
Function: mouse-on-link-p pos

This function returns non-nil if position pos in the current buffer is on a link. pos can also be a mouse event location, as returned by event-start (see section Accessing Mouse Events).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.9 Defining and Using Fields

A field is a range of consecutive characters in the buffer that are identified by having the same value (comparing with eq) of the field property (either a text-property or an overlay property). This section describes special functions that are available for operating on fields.

You specify a field with a buffer position, pos. We think of each field as containing a range of buffer positions, so the position you specify stands for the field containing that position.

When the characters before and after pos are part of the same field, there is no doubt which field contains pos: the one those characters both belong to. When pos is at a boundary between fields, which field it belongs to depends on the stickiness of the field properties of the two surrounding characters (see section Stickiness of Text Properties). The field whose property would be inherited by text inserted at pos is the field that contains pos.

There is an anomalous case where newly inserted text at pos would not inherit the field property from either side. This happens if the previous character’s field property is not rear-sticky, and the following character’s field property is not front-sticky. In this case, pos belongs to neither the preceding field nor the following field; the field functions treat it as belonging to an empty field whose beginning and end are both at pos.

In all of these functions, if pos is omitted or nil, the value of point is used by default. If narrowing is in effect, then pos should fall within the accessible portion. See section Narrowing.

Function: field-beginning &optional pos escape-from-edge limit

This function returns the beginning of the field specified by pos.

If pos is at the beginning of its field, and escape-from-edge is non-nil, then the return value is always the beginning of the preceding field that ends at pos, regardless of the stickiness of the field properties around pos.

If limit is non-nil, it is a buffer position; if the beginning of the field is before limit, then limit will be returned instead.

Function: field-end &optional pos escape-from-edge limit

This function returns the end of the field specified by pos.

If pos is at the end of its field, and escape-from-edge is non-nil, then the return value is always the end of the following field that begins at pos, regardless of the stickiness of the field properties around pos.

If limit is non-nil, it is a buffer position; if the end of the field is after limit, then limit will be returned instead.

Function: field-string &optional pos

This function returns the contents of the field specified by pos, as a string.

Function: field-string-no-properties &optional pos

This function returns the contents of the field specified by pos, as a string, discarding text properties.

Function: delete-field &optional pos

This function deletes the text of the field specified by pos.

Function: constrain-to-field new-pos old-pos &optional escape-from-edge only-in-line inhibit-capture-property

This function “constrains” new-pos to the field that old-pos belongs to—in other words, it returns the position closest to new-pos that is in the same field as old-pos.

If new-pos is nil, then constrain-to-field uses the value of point instead, and moves point to the resulting position in addition to returning that position.

If old-pos is at the boundary of two fields, then the acceptable final positions depend on the argument escape-from-edge. If escape-from-edge is nil, then new-pos must be in the field whose field property equals what new characters inserted at old-pos would inherit. (This depends on the stickiness of the field property for the characters before and after old-pos.) If escape-from-edge is non-nil, new-pos can be anywhere in the two adjacent fields. Additionally, if two fields are separated by another field with the special value boundary, then any point within this special field is also considered to be “on the boundary”.

Commands like C-a with no argument, that normally move backward to a specific kind of location and stay there once there, probably should specify nil for escape-from-edge. Other motion commands that check fields should probably pass t.

If the optional argument only-in-line is non-nil, and constraining new-pos in the usual way would move it to a different line, new-pos is returned unconstrained. This used in commands that move by line, such as next-line and beginning-of-line, so that they respect field boundaries only in the case where they can still move to the right line.

If the optional argument inhibit-capture-property is non-nil, and old-pos has a non-nil property of that name, then any field boundaries are ignored.

You can cause constrain-to-field to ignore all field boundaries (and so never constrain anything) by binding the variable inhibit-field-text-motion to a non-nil value.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.10 Why Text Properties are not Intervals

Some editors that support adding attributes to text in the buffer do so by letting the user specify “intervals” within the text, and adding the properties to the intervals. Those editors permit the user or the programmer to determine where individual intervals start and end. We deliberately provided a different sort of interface in Emacs Lisp to avoid certain paradoxical behavior associated with text modification.

If the actual subdivision into intervals is meaningful, that means you can distinguish between a buffer that is just one interval with a certain property, and a buffer containing the same text subdivided into two intervals, both of which have that property.

Suppose you take the buffer with just one interval and kill part of the text. The text remaining in the buffer is one interval, and the copy in the kill ring (and the undo list) becomes a separate interval. Then if you yank back the killed text, you get two intervals with the same properties. Thus, editing does not preserve the distinction between one interval and two.

Suppose we “fix” this problem by coalescing the two intervals when the text is inserted. That works fine if the buffer originally was a single interval. But suppose instead that we have two adjacent intervals with the same properties, and we kill the text of one interval and yank it back. The same interval-coalescence feature that rescues the other case causes trouble in this one: after yanking, we have just one interval. Once again, editing does not preserve the distinction between one interval and two.

Insertion of text at the border between intervals also raises questions that have no satisfactory answer.

However, it is easy to arrange for editing to behave consistently for questions of the form, “What are the properties of text at this buffer or string position?” So we have decided these are the only questions that make sense; we have not implemented asking questions about where intervals start or end.

In practice, you can usually use the text property search functions in place of explicit interval boundaries. You can think of them as finding the boundaries of intervals, assuming that intervals are always coalesced whenever possible. See section Text Property Search Functions.

Emacs also provides explicit intervals as a presentation feature; see Overlays.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.20 Substituting for a Character Code

The following functions replace characters within a specified region based on their character codes.

Function: subst-char-in-region start end old-char new-char &optional noundo

This function replaces all occurrences of the character old-char with the character new-char in the region of the current buffer defined by start and end.

If noundo is non-nil, then subst-char-in-region does not record the change for undo and does not mark the buffer as modified. This was useful for controlling the old selective display feature (see section Selective Display).

subst-char-in-region does not move point and returns nil.

---------- Buffer: foo ----------
This is the contents of the buffer before.
---------- Buffer: foo ----------
(subst-char-in-region 1 20 ?i ?X)
     ⇒ nil

---------- Buffer: foo ----------
ThXs Xs the contents of the buffer before.
---------- Buffer: foo ----------
Command: translate-region start end table

This function applies a translation table to the characters in the buffer between positions start and end.

The translation table table is a string or a char-table; (aref table ochar) gives the translated character corresponding to ochar. If table is a string, any characters with codes larger than the length of table are not altered by the translation.

The return value of translate-region is the number of characters that were actually changed by the translation. This does not count characters that were mapped into themselves in the translation table.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.21 Registers

A register is a sort of variable used in Emacs editing that can hold a variety of different kinds of values. Each register is named by a single character. All ASCII characters and their meta variants (but with the exception of C-g) can be used to name registers. Thus, there are 255 possible registers. A register is designated in Emacs Lisp by the character that is its name.

Variable: register-alist

This variable is an alist of elements of the form (name . contents). Normally, there is one element for each Emacs register that has been used.

The object name is a character (an integer) identifying the register.

The contents of a register can have several possible types:

a number

A number stands for itself. If insert-register finds a number in the register, it converts the number to decimal.

a marker

A marker represents a buffer position to jump to.

a string

A string is text saved in the register.

a rectangle

A rectangle is represented by a list of strings.

(window-configuration position)

This represents a window configuration to restore in one frame, and a position to jump to in the current buffer.

(frame-configuration position)

This represents a frame configuration to restore, and a position to jump to in the current buffer.

(file filename)

This represents a file to visit; jumping to this value visits file filename.

(file-query filename position)

This represents a file to visit and a position in it; jumping to this value visits file filename and goes to buffer position position. Restoring this type of position asks the user for confirmation first.

The functions in this section return unpredictable values unless otherwise stated.

Function: get-register reg

This function returns the contents of the register reg, or nil if it has no contents.

Function: set-register reg value

This function sets the contents of register reg to value. A register can be set to any value, but the other register functions expect only certain data types. The return value is value.

Command: view-register reg

This command displays what is contained in register reg.

Command: insert-register reg &optional beforep

This command inserts contents of register reg into the current buffer.

Normally, this command puts point before the inserted text, and the mark after it. However, if the optional second argument beforep is non-nil, it puts the mark before and point after. You can pass a non-nil second argument beforep to this function interactively by supplying any prefix argument.

If the register contains a rectangle, then the rectangle is inserted with its upper left corner at point. This means that text is inserted in the current line and underneath it on successive lines.

If the register contains something other than saved text (a string) or a rectangle (a list), currently useless things happen. This may be changed in the future.

Function: register-read-with-preview prompt

This function reads and returns a register name, prompting with prompt and possibly showing a preview of the existing registers and their contents. The preview is shown in a temporary window, after the delay specified by the user option register-preview-delay, if its value and register-alist are both non-nil. The preview is also shown if the user requests help (e.g., by typing the help character). We recommend that all interactive commands which read register names use this function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.22 Transposition of Text

This function can be used to transpose stretches of text:

Function: transpose-regions start1 end1 start2 end2 &optional leave-markers

This function exchanges two nonoverlapping portions of the buffer. Arguments start1 and end1 specify the bounds of one portion and arguments start2 and end2 specify the bounds of the other portion.

Normally, transpose-regions relocates markers with the transposed text; a marker previously positioned within one of the two transposed portions moves along with that portion, thus remaining between the same two characters in their new position. However, if leave-markers is non-nil, transpose-regions does not do this—it leaves all markers unrelocated.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.23 Dealing With Compressed Data

When auto-compression-mode is enabled, Emacs automatically uncompresses compressed files when you visit them, and automatically recompresses them if you alter and save them. See Compressed Files in The GNU Emacs Manual.

The above feature works by calling an external executable (e.g., gzip). Emacs can also be compiled with support for built-in decompression using the zlib library, which is faster than calling an external program.

Function: zlib-available-p

This function returns non-nil if built-in zlib decompression is available.

Function: zlib-decompress-region start end

This function decompresses the region between start and end, using built-in zlib decompression. The region should contain data that were compressed with gzip or zlib. On success, the function replaces the contents of the region with the decompressed data. On failure, the function leaves the region unchanged and returns nil. This function can be called only in unibyte buffers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.24 Base 64 Encoding

Base 64 code is used in email to encode a sequence of 8-bit bytes as a longer sequence of ASCII graphic characters. It is defined in Internet RFC142045. This section describes the functions for converting to and from this code.

Command: base64-encode-region beg end &optional no-line-break

This function converts the region from beg to end into base 64 code. It returns the length of the encoded text. An error is signaled if a character in the region is multibyte, i.e., in a multibyte buffer the region must contain only characters from the charsets ascii, eight-bit-control and eight-bit-graphic.

Normally, this function inserts newline characters into the encoded text, to avoid overlong lines. However, if the optional argument no-line-break is non-nil, these newlines are not added, so the output is just one long line.

Function: base64-encode-string string &optional no-line-break

This function converts the string string into base 64 code. It returns a string containing the encoded text. As for base64-encode-region, an error is signaled if a character in the string is multibyte.

Normally, this function inserts newline characters into the encoded text, to avoid overlong lines. However, if the optional argument no-line-break is non-nil, these newlines are not added, so the result string is just one long line.

Command: base64-decode-region beg end

This function converts the region from beg to end from base 64 code into the corresponding decoded text. It returns the length of the decoded text.

The decoding functions ignore newline characters in the encoded text.

Function: base64-decode-string string

This function converts the string string from base 64 code into the corresponding decoded text. It returns a unibyte string containing the decoded text.

The decoding functions ignore newline characters in the encoded text.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.25 Checksum/Hash

Emacs has built-in support for computing cryptographic hashes. A cryptographic hash, or checksum, is a digital “fingerprint” of a piece of data (e.g., a block of text) which can be used to check that you have an unaltered copy of that data.

Emacs supports several common cryptographic hash algorithms: MD5, SHA-1, SHA-2, SHA-224, SHA-256, SHA-384 and SHA-512. MD5 is the oldest of these algorithms, and is commonly used in message digests to check the integrity of messages transmitted over a network. MD5 is not “collision resistant” (i.e., it is possible to deliberately design different pieces of data which have the same MD5 hash), so you should not used it for anything security-related. A similar theoretical weakness also exists in SHA-1. Therefore, for security-related applications you should use the other hash types, such as SHA-2.

Function: secure-hash algorithm object &optional start end binary

This function returns a hash for object. The argument algorithm is a symbol stating which hash to compute: one of md5, sha1, sha224, sha256, sha384 or sha512. The argument object should be a buffer or a string.

The optional arguments start and end are character positions specifying the portion of object to compute the message digest for. If they are nil or omitted, the hash is computed for the whole of object.

If the argument binary is omitted or nil, the function returns the text form of the hash, as an ordinary Lisp string. If binary is non-nil, it returns the hash in binary form, as a sequence of bytes stored in a unibyte string.

This function does not compute the hash directly from the internal representation of object’s text (see section Text Representations). Instead, it encodes the text using a coding system (see section Coding Systems), and computes the hash from that encoded text. If object is a buffer, the coding system used is the one which would be chosen by default for writing the text into a file. If object is a string, the user’s preferred coding system is used (see Recognize Coding in GNU Emacs Manual).

Function: md5 object &optional start end coding-system noerror

This function returns an MD5 hash. It is semi-obsolete, since for most purposes it is equivalent to calling secure-hash with md5 as the algorithm argument. The object, start and end arguments have the same meanings as in secure-hash.

If coding-system is non-nil, it specifies a coding system to use to encode the text; if omitted or nil, the default coding system is used, like in secure-hash.

Normally, md5 signals an error if the text can’t be encoded using the specified or chosen coding system. However, if noerror is non-nil, it silently uses raw-text coding instead.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.26 Parsing HTML and XML

When Emacs is compiled with libxml2 support, the following functions are available to parse HTML or XML text into Lisp object trees.

Function: libxml-parse-html-region start end &optional base-url

This function parses the text between start and end as HTML, and returns a list representing the HTML parse tree. It attempts to handle “real world” HTML by robustly coping with syntax mistakes.

The optional argument base-url, if non-nil, should be a string specifying the base URL for relative URLs occurring in links.

In the parse tree, each HTML node is represented by a list in which the first element is a symbol representing the node name, the second element is an alist of node attributes, and the remaining elements are the subnodes.

The following example demonstrates this. Given this (malformed) HTML document:

<html><head></head><body width=101><div class=thing>Foo<div>Yes

A call to libxml-parse-html-region returns this:

(html ()
  (head ())
  (body ((width . "101"))
   (div ((class . "thing"))
    "Foo"
    (div ()
      "Yes"))))
Function: shr-insert-document dom

This function renders the parsed HTML in dom into the current buffer. The argument dom should be a list as generated by libxml-parse-html-region. This function is, e.g., used by EWW in The Emacs Web Wowser Manual.

Function: libxml-parse-xml-region start end &optional base-url

This function is the same as libxml-parse-html-region, except that it parses the text as XML rather than HTML (so it is stricter about syntax).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.27 Atomic Change Groups

In database terminology, an atomic change is an indivisible change—it can succeed entirely or it can fail entirely, but it cannot partly succeed. A Lisp program can make a series of changes to one or several buffers as an atomic change group, meaning that either the entire series of changes will be installed in their buffers or, in case of an error, none of them will be.

To do this for one buffer, the one already current, simply write a call to atomic-change-group around the code that makes the changes, like this:

(atomic-change-group
  (insert foo)
  (delete-region x y))

If an error (or other nonlocal exit) occurs inside the body of atomic-change-group, it unmakes all the changes in that buffer that were during the execution of the body. This kind of change group has no effect on any other buffers—any such changes remain.

If you need something more sophisticated, such as to make changes in various buffers constitute one atomic group, you must directly call lower-level functions that atomic-change-group uses.

Function: prepare-change-group &optional buffer

This function sets up a change group for buffer buffer, which defaults to the current buffer. It returns a “handle” that represents the change group. You must use this handle to activate the change group and subsequently to finish it.

To use the change group, you must activate it. You must do this before making any changes in the text of buffer.

Function: activate-change-group handle

This function activates the change group that handle designates.

After you activate the change group, any changes you make in that buffer become part of it. Once you have made all the desired changes in the buffer, you must finish the change group. There are two ways to do this: you can either accept (and finalize) all the changes, or cancel them all.

Function: accept-change-group handle

This function accepts all the changes in the change group specified by handle, making them final.

Function: cancel-change-group handle

This function cancels and undoes all the changes in the change group specified by handle.

Your code should use unwind-protect to make sure the group is always finished. The call to activate-change-group should be inside the unwind-protect, in case the user types C-g just after it runs. (This is one reason why prepare-change-group and activate-change-group are separate functions, because normally you would call prepare-change-group before the start of that unwind-protect.) Once you finish the group, don’t use the handle again—in particular, don’t try to finish the same group twice.

To make a multibuffer change group, call prepare-change-group once for each buffer you want to cover, then use nconc to combine the returned values, like this:

(nconc (prepare-change-group buffer-1)
       (prepare-change-group buffer-2))

You can then activate the multibuffer change group with a single call to activate-change-group, and finish it with a single call to accept-change-group or cancel-change-group.

Nested use of several change groups for the same buffer works as you would expect. Non-nested use of change groups for the same buffer will get Emacs confused, so don’t let it happen; the first change group you start for any given buffer should be the last one finished.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.28 Change Hooks

These hook variables let you arrange to take notice of all changes in all buffers (or in a particular buffer, if you make them buffer-local). See also Properties with Special Meanings, for how to detect changes to specific parts of the text.

The functions you use in these hooks should save and restore the match data if they do anything that uses regular expressions; otherwise, they will interfere in bizarre ways with the editing operations that call them.

Variable: before-change-functions

This variable holds a list of functions to call before any buffer modification. Each function gets two arguments, the beginning and end of the region that is about to change, represented as integers. The buffer that is about to change is always the current buffer.

Variable: after-change-functions

This variable holds a list of functions to call after any buffer modification. Each function receives three arguments: the beginning and end of the region just changed, and the length of the text that existed before the change. All three arguments are integers. The buffer that has been changed is always the current buffer.

The length of the old text is the difference between the buffer positions before and after that text as it was before the change. As for the changed text, its length is simply the difference between the first two arguments.

Output of messages into the *Messages* buffer does not call these functions.

Macro: combine-after-change-calls body…

The macro executes body normally, but arranges to call the after-change functions just once for a series of several changes—if that seems safe.

If a program makes several text changes in the same area of the buffer, using the macro combine-after-change-calls around that part of the program can make it run considerably faster when after-change hooks are in use. When the after-change hooks are ultimately called, the arguments specify a portion of the buffer including all of the changes made within the combine-after-change-calls body.

Warning: You must not alter the values of after-change-functions within the body of a combine-after-change-calls form.

Warning: if the changes you combine occur in widely scattered parts of the buffer, this will still work, but it is not advisable, because it may lead to inefficient behavior for some change hook functions.

Variable: first-change-hook

This variable is a normal hook that is run whenever a buffer is changed that was previously in the unmodified state.

Variable: inhibit-modification-hooks

If this variable is non-nil, all of the change hooks are disabled; none of them run. This affects all the hook variables described above in this section, as well as the hooks attached to certain special text properties (see section Properties with Special Meanings) and overlay properties (see section Overlay Properties).

Also, this variable is bound to non-nil while running those same hook variables, so that by default modifying the buffer from a modification hook does not cause other modification hooks to be run. If you do want modification hooks to be run in a particular piece of code that is itself run from a modification hook, then rebind locally inhibit-modification-hooks to nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32 Non-ASCII Characters

This chapter covers the special issues relating to characters and how they are stored in strings and buffers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.1 Text Representations

Emacs buffers and strings support a large repertoire of characters from many different scripts, allowing users to type and display text in almost any known written language.

To support this multitude of characters and scripts, Emacs closely follows the Unicode Standard. The Unicode Standard assigns a unique number, called a codepoint, to each and every character. The range of codepoints defined by Unicode, or the Unicode codespace, is 0..#x10FFFF (in hexadecimal notation), inclusive. Emacs extends this range with codepoints in the range #x110000..#x3FFFFF, which it uses for representing characters that are not unified with Unicode and raw 8-bit bytes that cannot be interpreted as characters. Thus, a character codepoint in Emacs is a 22-bit integer.

To conserve memory, Emacs does not hold fixed-length 22-bit numbers that are codepoints of text characters within buffers and strings. Rather, Emacs uses a variable-length internal representation of characters, that stores each character as a sequence of 1 to 5 8-bit bytes, depending on the magnitude of its codepoint15. For example, any ASCII character takes up only 1 byte, a Latin-1 character takes up 2 bytes, etc. We call this representation of text multibyte.

Outside Emacs, characters can be represented in many different encodings, such as ISO-8859-1, GB-2312, Big-5, etc. Emacs converts between these external encodings and its internal representation, as appropriate, when it reads text into a buffer or a string, or when it writes text to a disk file or passes it to some other process.

Occasionally, Emacs needs to hold and manipulate encoded text or binary non-text data in its buffers or strings. For example, when Emacs visits a file, it first reads the file’s text verbatim into a buffer, and only then converts it to the internal representation. Before the conversion, the buffer holds encoded text.

Encoded text is not really text, as far as Emacs is concerned, but rather a sequence of raw 8-bit bytes. We call buffers and strings that hold encoded text unibyte buffers and strings, because Emacs treats them as a sequence of individual bytes. Usually, Emacs displays unibyte buffers and strings as octal codes such as \237. We recommend that you never use unibyte buffers and strings except for manipulating encoded text or binary non-text data.

In a buffer, the buffer-local value of the variable enable-multibyte-characters specifies the representation used. The representation for a string is determined and recorded in the string when the string is constructed.

Variable: enable-multibyte-characters

This variable specifies the current buffer’s text representation. If it is non-nil, the buffer contains multibyte text; otherwise, it contains unibyte encoded text or binary non-text data.

You cannot set this variable directly; instead, use the function set-buffer-multibyte to change a buffer’s representation.

Function: position-bytes position

Buffer positions are measured in character units. This function returns the byte-position corresponding to buffer position position in the current buffer. This is 1 at the start of the buffer, and counts upward in bytes. If position is out of range, the value is nil.

Function: byte-to-position byte-position

Return the buffer position, in character units, corresponding to given byte-position in the current buffer. If byte-position is out of range, the value is nil. In a multibyte buffer, an arbitrary value of byte-position can be not at character boundary, but inside a multibyte sequence representing a single character; in this case, this function returns the buffer position of the character whose multibyte sequence includes byte-position. In other words, the value does not change for all byte positions that belong to the same character.

Function: multibyte-string-p string

Return t if string is a multibyte string, nil otherwise. This function also returns nil if string is some object other than a string.

Function: string-bytes string

This function returns the number of bytes in string. If string is a multibyte string, this can be greater than (length string).

Function: unibyte-string &rest bytes

This function concatenates all its argument bytes and makes the result a unibyte string.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.2 Disabling Multibyte Characters

By default, Emacs starts in multibyte mode: it stores the contents of buffers and strings using an internal encoding that represents non-ASCII characters using multi-byte sequences. Multibyte mode allows you to use all the supported languages and scripts without limitations.

Under very special circumstances, you may want to disable multibyte character support, for a specific buffer. When multibyte characters are disabled in a buffer, we call that unibyte mode. In unibyte mode, each character in the buffer has a character code ranging from 0 through 255 (0377 octal); 0 through 127 (0177 octal) represent ASCII characters, and 128 (0200 octal) through 255 (0377 octal) represent non-ASCII characters.

To edit a particular file in unibyte representation, visit it using find-file-literally. See section Functions for Visiting Files. You can convert a multibyte buffer to unibyte by saving it to a file, killing the buffer, and visiting the file again with find-file-literally. Alternatively, you can use C-x RET c (universal-coding-system-argument) and specify ‘raw-text’ as the coding system with which to visit or save a file. See Specifying a Coding System for File Text in GNU Emacs Manual. Unlike find-file-literally, finding a file as ‘raw-text’ doesn’t disable format conversion, uncompression, or auto mode selection.

The buffer-local variable enable-multibyte-characters is non-nil in multibyte buffers, and nil in unibyte ones. The mode line also indicates whether a buffer is multibyte or not. With a graphical display, in a multibyte buffer, the portion of the mode line that indicates the character set has a tooltip that (amongst other things) says that the buffer is multibyte. In a unibyte buffer, the character set indicator is absent. Thus, in a unibyte buffer (when using a graphical display) there is normally nothing before the indication of the visited file’s end-of-line convention (colon, backslash, etc.), unless you are using an input method.

You can turn off multibyte support in a specific buffer by invoking the command toggle-enable-multibyte-characters in that buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.3 Converting Text Representations

Emacs can convert unibyte text to multibyte; it can also convert multibyte text to unibyte, provided that the multibyte text contains only ASCII and 8-bit raw bytes. In general, these conversions happen when inserting text into a buffer, or when putting text from several strings together in one string. You can also explicitly convert a string’s contents to either representation.

Emacs chooses the representation for a string based on the text from which it is constructed. The general rule is to convert unibyte text to multibyte text when combining it with other multibyte text, because the multibyte representation is more general and can hold whatever characters the unibyte text has.

When inserting text into a buffer, Emacs converts the text to the buffer’s representation, as specified by enable-multibyte-characters in that buffer. In particular, when you insert multibyte text into a unibyte buffer, Emacs converts the text to unibyte, even though this conversion cannot in general preserve all the characters that might be in the multibyte text. The other natural alternative, to convert the buffer contents to multibyte, is not acceptable because the buffer’s representation is a choice made by the user that cannot be overridden automatically.

Converting unibyte text to multibyte text leaves ASCII characters unchanged, and converts bytes with codes 128 through 255 to the multibyte representation of raw eight-bit bytes.

Converting multibyte text to unibyte converts all ASCII and eight-bit characters to their single-byte form, but loses information for non-ASCII characters by discarding all but the low 8 bits of each character’s codepoint. Converting unibyte text to multibyte and back to unibyte reproduces the original unibyte text.

The next two functions either return the argument string, or a newly created string with no text properties.

Function: string-to-multibyte string

This function returns a multibyte string containing the same sequence of characters as string. If string is a multibyte string, it is returned unchanged. The function assumes that string includes only ASCII characters and raw 8-bit bytes; the latter are converted to their multibyte representation corresponding to the codepoints #x3FFF80 through #x3FFFFF, inclusive (see section codepoints).

Function: string-to-unibyte string

This function returns a unibyte string containing the same sequence of characters as string. It signals an error if string contains a non-ASCII character. If string is a unibyte string, it is returned unchanged. Use this function for string arguments that contain only ASCII and eight-bit characters.

Function: byte-to-string byte

This function returns a unibyte string containing a single byte of character data, character. It signals an error if character is not an integer between 0 and 255.

Function: multibyte-char-to-unibyte char

This converts the multibyte character char to a unibyte character, and returns that character. If char is neither ASCII nor eight-bit, the function returns -1.

Function: unibyte-char-to-multibyte char

This convert the unibyte character char to a multibyte character, assuming char is either ASCII or raw 8-bit byte.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.4 Selecting a Representation

Sometimes it is useful to examine an existing buffer or string as multibyte when it was unibyte, or vice versa.

Function: set-buffer-multibyte multibyte

Set the representation type of the current buffer. If multibyte is non-nil, the buffer becomes multibyte. If multibyte is nil, the buffer becomes unibyte.

This function leaves the buffer contents unchanged when viewed as a sequence of bytes. As a consequence, it can change the contents viewed as characters; for instance, a sequence of three bytes which is treated as one character in multibyte representation will count as three characters in unibyte representation. Eight-bit characters representing raw bytes are an exception. They are represented by one byte in a unibyte buffer, but when the buffer is set to multibyte, they are converted to two-byte sequences, and vice versa.

This function sets enable-multibyte-characters to record which representation is in use. It also adjusts various data in the buffer (including overlays, text properties and markers) so that they cover the same text as they did before.

This function signals an error if the buffer is narrowed, since the narrowing might have occurred in the middle of multibyte character sequences.

This function also signals an error if the buffer is an indirect buffer. An indirect buffer always inherits the representation of its base buffer.

Function: string-as-unibyte string

If string is already a unibyte string, this function returns string itself. Otherwise, it returns a new string with the same bytes as string, but treating each byte as a separate character (so that the value may have more characters than string); as an exception, each eight-bit character representing a raw byte is converted into a single byte. The newly-created string contains no text properties.

Function: string-as-multibyte string

If string is a multibyte string, this function returns string itself. Otherwise, it returns a new string with the same bytes as string, but treating each multibyte sequence as one character. This means that the value may have fewer characters than string has. If a byte sequence in string is invalid as a multibyte representation of a single character, each byte in the sequence is treated as a raw 8-bit byte. The newly-created string contains no text properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.5 Character Codes

The unibyte and multibyte text representations use different character codes. The valid character codes for unibyte representation range from 0 to #xFF (255)—the values that can fit in one byte. The valid character codes for multibyte representation range from 0 to #x3FFFFF. In this code space, values 0 through #x7F (127) are for ASCII characters, and values #x80 (128) through #x3FFF7F (4194175) are for non-ASCII characters.

Emacs character codes are a superset of the Unicode standard. Values 0 through #x10FFFF (1114111) correspond to Unicode characters of the same codepoint; values #x110000 (1114112) through #x3FFF7F (4194175) represent characters that are not unified with Unicode; and values #x3FFF80 (4194176) through #x3FFFFF (4194303) represent eight-bit raw bytes.

Function: characterp charcode

This returns t if charcode is a valid character, and nil otherwise.

(characterp 65)
     ⇒ t
(characterp 4194303)
     ⇒ t
(characterp 4194304)
     ⇒ nil
Function: max-char

This function returns the largest value that a valid character codepoint can have.

(characterp (max-char))
     ⇒ t
(characterp (1+ (max-char)))
     ⇒ nil
Function: get-byte &optional pos string

This function returns the byte at character position pos in the current buffer. If the current buffer is unibyte, this is literally the byte at that position. If the buffer is multibyte, byte values of ASCII characters are the same as character codepoints, whereas eight-bit raw bytes are converted to their 8-bit codes. The function signals an error if the character at pos is non-ASCII.

The optional argument string means to get a byte value from that string instead of the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.6 Character Properties

A character property is a named attribute of a character that specifies how the character behaves and how it should be handled during text processing and display. Thus, character properties are an important part of specifying the character’s semantics.

On the whole, Emacs follows the Unicode Standard in its implementation of character properties. In particular, Emacs supports the Unicode Character Property Model, and the Emacs character property database is derived from the Unicode Character Database (UCD). See the Character Properties chapter of the Unicode Standard, for a detailed description of Unicode character properties and their meaning. This section assumes you are already familiar with that chapter of the Unicode Standard, and want to apply that knowledge to Emacs Lisp programs.

In Emacs, each property has a name, which is a symbol, and a set of possible values, whose types depend on the property; if a character does not have a certain property, the value is nil. As a general rule, the names of character properties in Emacs are produced from the corresponding Unicode properties by downcasing them and replacing each ‘_’ character with a dash ‘-’. For example, Canonical_Combining_Class becomes canonical-combining-class. However, sometimes we shorten the names to make their use easier.

Some codepoints are left unassigned by the UCD—they don’t correspond to any character. The Unicode Standard defines default values of properties for such codepoints; they are mentioned below for each property.

Here is the full list of value types for all the character properties that Emacs knows about:

name

Corresponds to the Name Unicode property. The value is a string consisting of upper-case Latin letters A to Z, digits, spaces, and hyphen ‘-’ characters. For unassigned codepoints, the value is nil.

general-category

Corresponds to the General_Category Unicode property. The value is a symbol whose name is a 2-letter abbreviation of the character’s classification. For unassigned codepoints, the value is Cn.

canonical-combining-class

Corresponds to the Canonical_Combining_Class Unicode property. The value is an integer. For unassigned codepoints, the value is zero.

bidi-class

Corresponds to the Unicode Bidi_Class property. The value is a symbol whose name is the Unicode directional type of the character. Emacs uses this property when it reorders bidirectional text for display (see section Bidirectional Display). For unassigned codepoints, the value depends on the code blocks to which the codepoint belongs: most unassigned codepoints get the value of L (strong L), but some get values of AL (Arabic letter) or R (strong R).

decomposition

Corresponds to the Unicode properties Decomposition_Type and Decomposition_Value. The value is a list, whose first element may be a symbol representing a compatibility formatting tag, such as small16; the other elements are characters that give the compatibility decomposition sequence of this character. For unassigned codepoints, the value is the character itself.

decimal-digit-value

Corresponds to the Unicode Numeric_Value property for characters whose Numeric_Type is ‘Decimal’. The value is an integer. For unassigned codepoints, the value is nil, which means NaN, or “not-a-number”.

digit-value

Corresponds to the Unicode Numeric_Value property for characters whose Numeric_Type is ‘Digit’. The value is an integer. Examples of such characters include compatibility subscript and superscript digits, for which the value is the corresponding number. For unassigned codepoints, the value is nil, which means NaN.

numeric-value

Corresponds to the Unicode Numeric_Value property for characters whose Numeric_Type is ‘Numeric’. The value of this property is a number. Examples of characters that have this property include fractions, subscripts, superscripts, Roman numerals, currency numerators, and encircled numbers. For example, the value of this property for the character U+2155 (VULGAR FRACTION ONE FIFTH) is 0.2. For unassigned codepoints, the value is nil, which means NaN.

mirrored

Corresponds to the Unicode Bidi_Mirrored property. The value of this property is a symbol, either Y or N. For unassigned codepoints, the value is N.

mirroring

Corresponds to the Unicode Bidi_Mirroring_Glyph property. The value of this property is a character whose glyph represents the mirror image of the character’s glyph, or nil if there’s no defined mirroring glyph. All the characters whose mirrored property is N have nil as their mirroring property; however, some characters whose mirrored property is Y also have nil for mirroring, because no appropriate characters exist with mirrored glyphs. Emacs uses this property to display mirror images of characters when appropriate (see section Bidirectional Display). For unassigned codepoints, the value is nil.

old-name

Corresponds to the Unicode Unicode_1_Name property. The value is a string. Unassigned codepoints, and characters that have no value for this property, the value is nil.

iso-10646-comment

Corresponds to the Unicode ISO_Comment property. The value is a string. For unassigned codepoints, the value is an empty string.

uppercase

Corresponds to the Unicode Simple_Uppercase_Mapping property. The value of this property is a single character. For unassigned codepoints, the value is nil, which means the character itself.

lowercase

Corresponds to the Unicode Simple_Lowercase_Mapping property. The value of this property is a single character. For unassigned codepoints, the value is nil, which means the character itself.

titlecase

Corresponds to the Unicode Simple_Titlecase_Mapping property. Title case is a special form of a character used when the first character of a word needs to be capitalized. The value of this property is a single character. For unassigned codepoints, the value is nil, which means the character itself.

Function: get-char-code-property char propname

This function returns the value of char’s propname property.

(get-char-code-property ?\s 'general-category)
     ⇒ Zs
(get-char-code-property ?1 'general-category)
     ⇒ Nd
;; subscript 4
(get-char-code-property ?\u2084 'digit-value)
     ⇒ 4
;; one fifth
(get-char-code-property ?\u2155 'numeric-value)
     ⇒ 0.2
;; Roman IV
(get-char-code-property ?\u2163 'numeric-value)
     ⇒ 4
Function: char-code-property-description prop value

This function returns the description string of property prop’s value, or nil if value has no description.

(char-code-property-description 'general-category 'Zs)
     ⇒ "Separator, Space"
(char-code-property-description 'general-category 'Nd)
     ⇒ "Number, Decimal Digit"
(char-code-property-description 'numeric-value '1/5)
     ⇒ nil
Function: put-char-code-property char propname value

This function stores value as the value of the property propname for the character char.

Variable: unicode-category-table

The value of this variable is a char-table (see section Char-Tables) that specifies, for each character, its Unicode General_Category property as a symbol.

Variable: char-script-table

The value of this variable is a char-table that specifies, for each character, a symbol whose name is the script to which the character belongs, according to the Unicode Standard classification of the Unicode code space into script-specific blocks. This char-table has a single extra slot whose value is the list of all script symbols.

Variable: char-width-table

The value of this variable is a char-table that specifies the width of each character in columns that it will occupy on the screen.

Variable: printable-chars

The value of this variable is a char-table that specifies, for each character, whether it is printable or not. That is, if evaluating (aref printable-chars char) results in t, the character is printable, and if it results in nil, it is not.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.7 Character Sets

An Emacs character set, or charset, is a set of characters in which each character is assigned a numeric code point. (The Unicode Standard calls this a coded character set.) Each Emacs charset has a name which is a symbol. A single character can belong to any number of different character sets, but it will generally have a different code point in each charset. Examples of character sets include ascii, iso-8859-1, greek-iso8859-7, and windows-1255. The code point assigned to a character in a charset is usually different from its code point used in Emacs buffers and strings.

Emacs defines several special character sets. The character set unicode includes all the characters whose Emacs code points are in the range 0..#x10FFFF. The character set emacs includes all ASCII and non-ASCII characters. Finally, the eight-bit charset includes the 8-bit raw bytes; Emacs uses it to represent raw bytes encountered in text.

Function: charsetp object

Returns t if object is a symbol that names a character set, nil otherwise.

Variable: charset-list

The value is a list of all defined character set names.

Function: charset-priority-list &optional highestp

This function returns a list of all defined character sets ordered by their priority. If highestp is non-nil, the function returns a single character set of the highest priority.

Function: set-charset-priority &rest charsets

This function makes charsets the highest priority character sets.

Function: char-charset character &optional restriction

This function returns the name of the character set of highest priority that character belongs to. ASCII characters are an exception: for them, this function always returns ascii.

If restriction is non-nil, it should be a list of charsets to search. Alternatively, it can be a coding system, in which case the returned charset must be supported by that coding system (see section Coding Systems).

Function: charset-plist charset

This function returns the property list of the character set charset. Although charset is a symbol, this is not the same as the property list of that symbol. Charset properties include important information about the charset, such as its documentation string, short name, etc.

Function: put-charset-property charset propname value

This function sets the propname property of charset to the given value.

Function: get-charset-property charset propname

This function returns the value of charsets property propname.

Command: list-charset-chars charset

This command displays a list of characters in the character set charset.

Emacs can convert between its internal representation of a character and the character’s codepoint in a specific charset. The following two functions support these conversions.

Function: decode-char charset code-point

This function decodes a character that is assigned a code-point in charset, to the corresponding Emacs character, and returns it. If charset doesn’t contain a character of that code point, the value is nil. If code-point doesn’t fit in a Lisp integer (see section most-positive-fixnum), it can be specified as a cons cell (high . low), where low are the lower 16 bits of the value and high are the high 16 bits.

Function: encode-char char charset

This function returns the code point assigned to the character char in charset. If the result does not fit in a Lisp integer, it is returned as a cons cell (high . low) that fits the second argument of decode-char above. If charset doesn’t have a codepoint for char, the value is nil.

The following function comes in handy for applying a certain function to all or part of the characters in a charset:

Function: map-charset-chars function charset &optional arg from-code to-code

Call function for characters in charset. function is called with two arguments. The first one is a cons cell (from . to), where from and to indicate a range of characters contained in charset. The second argument passed to function is arg.

By default, the range of codepoints passed to function includes all the characters in charset, but optional arguments from-code and to-code limit that to the range of characters between these two codepoints of charset. If either of them is nil, it defaults to the first or last codepoint of charset, respectively.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.8 Scanning for Character Sets

Sometimes it is useful to find out which character set a particular character belongs to. One use for this is in determining which coding systems (see section Coding Systems) are capable of representing all of the text in question; another is to determine the font(s) for displaying that text.

Function: charset-after &optional pos

This function returns the charset of highest priority containing the character at position pos in the current buffer. If pos is omitted or nil, it defaults to the current value of point. If pos is out of range, the value is nil.

Function: find-charset-region beg end &optional translation

This function returns a list of the character sets of highest priority that contain characters in the current buffer between positions beg and end.

The optional argument translation specifies a translation table to use for scanning the text (see section Translation of Characters). If it is non-nil, then each character in the region is translated through this table, and the value returned describes the translated characters instead of the characters actually in the buffer.

Function: find-charset-string string &optional translation

This function returns a list of character sets of highest priority that contain characters in string. It is just like find-charset-region, except that it applies to the contents of string instead of part of the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.9 Translation of Characters

A translation table is a char-table (see section Char-Tables) that specifies a mapping of characters into characters. These tables are used in encoding and decoding, and for other purposes. Some coding systems specify their own particular translation tables; there are also default translation tables which apply to all other coding systems.

A translation table has two extra slots. The first is either nil or a translation table that performs the reverse translation; the second is the maximum number of characters to look up for translating sequences of characters (see the description of make-translation-table-from-alist below).

Function: make-translation-table &rest translations

This function returns a translation table based on the argument translations. Each element of translations should be a list of elements of the form (from . to); this says to translate the character from into to.

The arguments and the forms in each argument are processed in order, and if a previous form already translates to to some other character, say to-alt, from is also translated to to-alt.

During decoding, the translation table’s translations are applied to the characters that result from ordinary decoding. If a coding system has the property :decode-translation-table, that specifies the translation table to use, or a list of translation tables to apply in sequence. (This is a property of the coding system, as returned by coding-system-get, not a property of the symbol that is the coding system’s name. See section Basic Concepts of Coding Systems.) Finally, if standard-translation-table-for-decode is non-nil, the resulting characters are translated by that table.

During encoding, the translation table’s translations are applied to the characters in the buffer, and the result of translation is actually encoded. If a coding system has property :encode-translation-table, that specifies the translation table to use, or a list of translation tables to apply in sequence. In addition, if the variable standard-translation-table-for-encode is non-nil, it specifies the translation table to use for translating the result.

Variable: standard-translation-table-for-decode

This is the default translation table for decoding. If a coding systems specifies its own translation tables, the table that is the value of this variable, if non-nil, is applied after them.

Variable: standard-translation-table-for-encode

This is the default translation table for encoding. If a coding systems specifies its own translation tables, the table that is the value of this variable, if non-nil, is applied after them.

Variable: translation-table-for-input

Self-inserting characters are translated through this translation table before they are inserted. Search commands also translate their input through this table, so they can compare more reliably with what’s in the buffer.

This variable automatically becomes buffer-local when set.

Function: make-translation-table-from-vector vec

This function returns a translation table made from vec that is an array of 256 elements to map bytes (values 0 through #xFF) to characters. Elements may be nil for untranslated bytes. The returned table has a translation table for reverse mapping in the first extra slot, and the value 1 in the second extra slot.

This function provides an easy way to make a private coding system that maps each byte to a specific character. You can specify the returned table and the reverse translation table using the properties :decode-translation-table and :encode-translation-table respectively in the props argument to define-coding-system.

Function: make-translation-table-from-alist alist

This function is similar to make-translation-table but returns a complex translation table rather than a simple one-to-one mapping. Each element of alist is of the form (from . to), where from and to are either characters or vectors specifying a sequence of characters. If from is a character, that character is translated to to (i.e., to a character or a character sequence). If from is a vector of characters, that sequence is translated to to. The returned table has a translation table for reverse mapping in the first extra slot, and the maximum length of all the from character sequences in the second extra slot.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10 Coding Systems

When Emacs reads or writes a file, and when Emacs sends text to a subprocess or receives text from a subprocess, it normally performs character code conversion and end-of-line conversion as specified by a particular coding system.

How to define a coding system is an arcane matter, and is not documented here.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.1 Basic Concepts of Coding Systems

Character code conversion involves conversion between the internal representation of characters used inside Emacs and some other encoding. Emacs supports many different encodings, in that it can convert to and from them. For example, it can convert text to or from encodings such as Latin 1, Latin 2, Latin 3, Latin 4, Latin 5, and several variants of ISO 2022. In some cases, Emacs supports several alternative encodings for the same characters; for example, there are three coding systems for the Cyrillic (Russian) alphabet: ISO, Alternativnyj, and KOI8.

Every coding system specifies a particular set of character code conversions, but the coding system undecided is special: it leaves the choice unspecified, to be chosen heuristically for each file, based on the file’s data.

In general, a coding system doesn’t guarantee roundtrip identity: decoding a byte sequence using coding system, then encoding the resulting text in the same coding system, can produce a different byte sequence. But some coding systems do guarantee that the byte sequence will be the same as what you originally decoded. Here are a few examples:

iso-8859-1, utf-8, big5, shift_jis, euc-jp

Encoding buffer text and then decoding the result can also fail to reproduce the original text. For instance, if you encode a character with a coding system which does not support that character, the result is unpredictable, and thus decoding it using the same coding system may produce a different text. Currently, Emacs can’t report errors that result from encoding unsupported characters.

End of line conversion handles three different conventions used on various systems for representing end of line in files. The Unix convention, used on GNU and Unix systems, is to use the linefeed character (also called newline). The DOS convention, used on MS-Windows and MS-DOS systems, is to use a carriage-return and a linefeed at the end of a line. The Mac convention is to use just carriage-return. (This was the convention used on the Macintosh system prior to OS X.)

Base coding systems such as latin-1 leave the end-of-line conversion unspecified, to be chosen based on the data. Variant coding systems such as latin-1-unix, latin-1-dos and latin-1-mac specify the end-of-line conversion explicitly as well. Most base coding systems have three corresponding variants whose names are formed by adding ‘-unix’, ‘-dos’ and ‘-mac’.

The coding system raw-text is special in that it prevents character code conversion, and causes the buffer visited with this coding system to be a unibyte buffer. For historical reasons, you can save both unibyte and multibyte text with this coding system. When you use raw-text to encode multibyte text, it does perform one character code conversion: it converts eight-bit characters to their single-byte external representation. raw-text does not specify the end-of-line conversion, allowing that to be determined as usual by the data, and has the usual three variants which specify the end-of-line conversion.

no-conversion (and its alias binary) is equivalent to raw-text-unix: it specifies no conversion of either character codes or end-of-line.

The coding system utf-8-emacs specifies that the data is represented in the internal Emacs encoding (see section Text Representations). This is like raw-text in that no code conversion happens, but different in that the result is multibyte data. The name emacs-internal is an alias for utf-8-emacs.

Function: coding-system-get coding-system property

This function returns the specified property of the coding system coding-system. Most coding system properties exist for internal purposes, but one that you might find useful is :mime-charset. That property’s value is the name used in MIME for the character coding which this coding system can read and write. Examples:

(coding-system-get 'iso-latin-1 :mime-charset)
     ⇒ iso-8859-1
(coding-system-get 'iso-2022-cn :mime-charset)
     ⇒ iso-2022-cn
(coding-system-get 'cyrillic-koi8 :mime-charset)
     ⇒ koi8-r

The value of the :mime-charset property is also defined as an alias for the coding system.

Function: coding-system-aliases coding-system

This function returns the list of aliases of coding-system.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.2 Encoding and I/O

The principal purpose of coding systems is for use in reading and writing files. The function insert-file-contents uses a coding system to decode the file data, and write-region uses one to encode the buffer contents.

You can specify the coding system to use either explicitly (see section Specifying a Coding System for One Operation), or implicitly using a default mechanism (see section Default Coding Systems). But these methods may not completely specify what to do. For example, they may choose a coding system such as undefined which leaves the character code conversion to be determined from the data. In these cases, the I/O operation finishes the job of choosing a coding system. Very often you will want to find out afterwards which coding system was chosen.

Variable: buffer-file-coding-system

This buffer-local variable records the coding system used for saving the buffer and for writing part of the buffer with write-region. If the text to be written cannot be safely encoded using the coding system specified by this variable, these operations select an alternative encoding by calling the function select-safe-coding-system (see section User-Chosen Coding Systems). If selecting a different encoding requires to ask the user to specify a coding system, buffer-file-coding-system is updated to the newly selected coding system.

buffer-file-coding-system does not affect sending text to a subprocess.

Variable: save-buffer-coding-system

This variable specifies the coding system for saving the buffer (by overriding buffer-file-coding-system). Note that it is not used for write-region.

When a command to save the buffer starts out to use buffer-file-coding-system (or save-buffer-coding-system), and that coding system cannot handle the actual text in the buffer, the command asks the user to choose another coding system (by calling select-safe-coding-system). After that happens, the command also updates buffer-file-coding-system to represent the coding system that the user specified.

Variable: last-coding-system-used

I/O operations for files and subprocesses set this variable to the coding system name that was used. The explicit encoding and decoding functions (see section Explicit Encoding and Decoding) set it too.

Warning: Since receiving subprocess output sets this variable, it can change whenever Emacs waits; therefore, you should copy the value shortly after the function call that stores the value you are interested in.

The variable selection-coding-system specifies how to encode selections for the window system. See section Window System Selections.

Variable: file-name-coding-system

The variable file-name-coding-system specifies the coding system to use for encoding file names. Emacs encodes file names using that coding system for all file operations. If file-name-coding-system is nil, Emacs uses a default coding system determined by the selected language environment. In the default language environment, any non-ASCII characters in file names are not encoded specially; they appear in the file system using the internal Emacs representation.

Warning: if you change file-name-coding-system (or the language environment) in the middle of an Emacs session, problems can result if you have already visited files whose names were encoded using the earlier coding system and are handled differently under the new coding system. If you try to save one of these buffers under the visited file name, saving may use the wrong file name, or it may get an error. If such a problem happens, use C-x C-w to specify a new file name for that buffer.

On Windows 2000 and later, Emacs by default uses Unicode APIs to pass file names to the OS, so the value of file-name-coding-system is largely ignored. Lisp applications that need to encode or decode file names on the Lisp level should use utf-8 coding-system when system-type is windows-nt; the conversion of UTF-8 encoded file names to the encoding appropriate for communicating with the OS is performed internally by Emacs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.3 Coding Systems in Lisp

Here are the Lisp facilities for working with coding systems:

Function: coding-system-list &optional base-only

This function returns a list of all coding system names (symbols). If base-only is non-nil, the value includes only the base coding systems. Otherwise, it includes alias and variant coding systems as well.

Function: coding-system-p object

This function returns t if object is a coding system name or nil.

Function: check-coding-system coding-system

This function checks the validity of coding-system. If that is valid, it returns coding-system. If coding-system is nil, the function return nil. For any other values, it signals an error whose error-symbol is coding-system-error (see section signal).

Function: coding-system-eol-type coding-system

This function returns the type of end-of-line (a.k.a. eol) conversion used by coding-system. If coding-system specifies a certain eol conversion, the return value is an integer 0, 1, or 2, standing for unix, dos, and mac, respectively. If coding-system doesn’t specify eol conversion explicitly, the return value is a vector of coding systems, each one with one of the possible eol conversion types, like this:

(coding-system-eol-type 'latin-1)
     ⇒ [latin-1-unix latin-1-dos latin-1-mac]

If this function returns a vector, Emacs will decide, as part of the text encoding or decoding process, what eol conversion to use. For decoding, the end-of-line format of the text is auto-detected, and the eol conversion is set to match it (e.g., DOS-style CRLF format will imply dos eol conversion). For encoding, the eol conversion is taken from the appropriate default coding system (e.g., default value of buffer-file-coding-system for buffer-file-coding-system), or from the default eol conversion appropriate for the underlying platform.

Function: coding-system-change-eol-conversion coding-system eol-type

This function returns a coding system which is like coding-system except for its eol conversion, which is specified by eol-type. eol-type should be unix, dos, mac, or nil. If it is nil, the returned coding system determines the end-of-line conversion from the data.

eol-type may also be 0, 1 or 2, standing for unix, dos and mac, respectively.

Function: coding-system-change-text-conversion eol-coding text-coding

This function returns a coding system which uses the end-of-line conversion of eol-coding, and the text conversion of text-coding. If text-coding is nil, it returns undecided, or one of its variants according to eol-coding.

Function: find-coding-systems-region from to

This function returns a list of coding systems that could be used to encode a text between from and to. All coding systems in the list can safely encode any multibyte characters in that portion of the text.

If the text contains no multibyte characters, the function returns the list (undecided).

Function: find-coding-systems-string string

This function returns a list of coding systems that could be used to encode the text of string. All coding systems in the list can safely encode any multibyte characters in string. If the text contains no multibyte characters, this returns the list (undecided).

Function: find-coding-systems-for-charsets charsets

This function returns a list of coding systems that could be used to encode all the character sets in the list charsets.

Function: check-coding-systems-region start end coding-system-list

This function checks whether coding systems in the list coding-system-list can encode all the characters in the region between start and end. If all of the coding systems in the list can encode the specified text, the function returns nil. If some coding systems cannot encode some of the characters, the value is an alist, each element of which has the form (coding-system1 pos1 pos2 …), meaning that coding-system1 cannot encode characters at buffer positions pos1, pos2, ....

start may be a string, in which case end is ignored and the returned value references string indices instead of buffer positions.

Function: detect-coding-region start end &optional highest

This function chooses a plausible coding system for decoding the text from start to end. This text should be a byte sequence, i.e., unibyte text or multibyte text with only ASCII and eight-bit characters (see section Explicit Encoding and Decoding).

Normally this function returns a list of coding systems that could handle decoding the text that was scanned. They are listed in order of decreasing priority. But if highest is non-nil, then the return value is just one coding system, the one that is highest in priority.

If the region contains only ASCII characters except for such ISO-2022 control characters ISO-2022 as ESC, the value is undecided or (undecided), or a variant specifying end-of-line conversion, if that can be deduced from the text.

If the region contains null bytes, the value is no-conversion, even if the region contains text encoded in some coding system.

Function: detect-coding-string string &optional highest

This function is like detect-coding-region except that it operates on the contents of string instead of bytes in the buffer.

Variable: inhibit-null-byte-detection

If this variable has a non-nil value, null bytes are ignored when detecting the encoding of a region or a string. This allows to correctly detect the encoding of text that contains null bytes, such as Info files with Index nodes.

Variable: inhibit-iso-escape-detection

If this variable has a non-nil value, ISO-2022 escape sequences are ignored when detecting the encoding of a region or a string. The result is that no text is ever detected as encoded in some ISO-2022 encoding, and all escape sequences become visible in a buffer. Warning: Use this variable with extreme caution, because many files in the Emacs distribution use ISO-2022 encoding.

Function: coding-system-charset-list coding-system

This function returns the list of character sets (see section Character Sets) supported by coding-system. Some coding systems that support too many character sets to list them all yield special values:

See Process Information, in particular the description of the functions process-coding-system and set-process-coding-system, for how to examine or set the coding systems used for I/O to a subprocess.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.4 User-Chosen Coding Systems

Function: select-safe-coding-system from to &optional default-coding-system accept-default-p file

This function selects a coding system for encoding specified text, asking the user to choose if necessary. Normally the specified text is the text in the current buffer between from and to. If from is a string, the string specifies the text to encode, and to is ignored.

If the specified text includes raw bytes (see section Text Representations), select-safe-coding-system suggests raw-text for its encoding.

If default-coding-system is non-nil, that is the first coding system to try; if that can handle the text, select-safe-coding-system returns that coding system. It can also be a list of coding systems; then the function tries each of them one by one. After trying all of them, it next tries the current buffer’s value of buffer-file-coding-system (if it is not undecided), then the default value of buffer-file-coding-system and finally the user’s most preferred coding system, which the user can set using the command prefer-coding-system (see Recognizing Coding Systems in The GNU Emacs Manual).

If one of those coding systems can safely encode all the specified text, select-safe-coding-system chooses it and returns it. Otherwise, it asks the user to choose from a list of coding systems which can encode all the text, and returns the user’s choice.

default-coding-system can also be a list whose first element is t and whose other elements are coding systems. Then, if no coding system in the list can handle the text, select-safe-coding-system queries the user immediately, without trying any of the three alternatives described above.

The optional argument accept-default-p, if non-nil, should be a function to determine whether a coding system selected without user interaction is acceptable. select-safe-coding-system calls this function with one argument, the base coding system of the selected coding system. If accept-default-p returns nil, select-safe-coding-system rejects the silently selected coding system, and asks the user to select a coding system from a list of possible candidates.

If the variable select-safe-coding-system-accept-default-p is non-nil, it should be a function taking a single argument. It is used in place of accept-default-p, overriding any value supplied for this argument.

As a final step, before returning the chosen coding system, select-safe-coding-system checks whether that coding system is consistent with what would be selected if the contents of the region were read from a file. (If not, this could lead to data corruption in a file subsequently re-visited and edited.) Normally, select-safe-coding-system uses buffer-file-name as the file for this purpose, but if file is non-nil, it uses that file instead (this can be relevant for write-region and similar functions). If it detects an apparent inconsistency, select-safe-coding-system queries the user before selecting the coding system.

Here are two functions you can use to let the user specify a coding system, with completion. See section Completion.

Function: read-coding-system prompt &optional default

This function reads a coding system using the minibuffer, prompting with string prompt, and returns the coding system name as a symbol. If the user enters null input, default specifies which coding system to return. It should be a symbol or a string.

Function: read-non-nil-coding-system prompt

This function reads a coding system using the minibuffer, prompting with string prompt, and returns the coding system name as a symbol. If the user tries to enter null input, it asks the user to try again. See section Coding Systems.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.5 Default Coding Systems

This section describes variables that specify the default coding system for certain files or when running certain subprograms, and the function that I/O operations use to access them.

The idea of these variables is that you set them once and for all to the defaults you want, and then do not change them again. To specify a particular coding system for a particular operation in a Lisp program, don’t change these variables; instead, override them using coding-system-for-read and coding-system-for-write (see section Specifying a Coding System for One Operation).

User Option: auto-coding-regexp-alist

This variable is an alist of text patterns and corresponding coding systems. Each element has the form (regexp . coding-system); a file whose first few kilobytes match regexp is decoded with coding-system when its contents are read into a buffer. The settings in this alist take priority over coding: tags in the files and the contents of file-coding-system-alist (see below). The default value is set so that Emacs automatically recognizes mail files in Babyl format and reads them with no code conversions.

User Option: file-coding-system-alist

This variable is an alist that specifies the coding systems to use for reading and writing particular files. Each element has the form (pattern . coding), where pattern is a regular expression that matches certain file names. The element applies to file names that match pattern.

The CDR of the element, coding, should be either a coding system, a cons cell containing two coding systems, or a function name (a symbol with a function definition). If coding is a coding system, that coding system is used for both reading the file and writing it. If coding is a cons cell containing two coding systems, its CAR specifies the coding system for decoding, and its CDR specifies the coding system for encoding.

If coding is a function name, the function should take one argument, a list of all arguments passed to find-operation-coding-system. It must return a coding system or a cons cell containing two coding systems. This value has the same meaning as described above.

If coding (or what returned by the above function) is undecided, the normal code-detection is performed.

User Option: auto-coding-alist

This variable is an alist that specifies the coding systems to use for reading and writing particular files. Its form is like that of file-coding-system-alist, but, unlike the latter, this variable takes priority over any coding: tags in the file.

Variable: process-coding-system-alist

This variable is an alist specifying which coding systems to use for a subprocess, depending on which program is running in the subprocess. It works like file-coding-system-alist, except that pattern is matched against the program name used to start the subprocess. The coding system or systems specified in this alist are used to initialize the coding systems used for I/O to the subprocess, but you can specify other coding systems later using set-process-coding-system.

Warning: Coding systems such as undecided, which determine the coding system from the data, do not work entirely reliably with asynchronous subprocess output. This is because Emacs handles asynchronous subprocess output in batches, as it arrives. If the coding system leaves the character code conversion unspecified, or leaves the end-of-line conversion unspecified, Emacs must try to detect the proper conversion from one batch at a time, and this does not always work.

Therefore, with an asynchronous subprocess, if at all possible, use a coding system which determines both the character code conversion and the end of line conversion—that is, one like latin-1-unix, rather than undecided or latin-1.

Variable: network-coding-system-alist

This variable is an alist that specifies the coding system to use for network streams. It works much like file-coding-system-alist, with the difference that the pattern in an element may be either a port number or a regular expression. If it is a regular expression, it is matched against the network service name used to open the network stream.

Variable: default-process-coding-system

This variable specifies the coding systems to use for subprocess (and network stream) input and output, when nothing else specifies what to do.

The value should be a cons cell of the form (input-coding . output-coding). Here input-coding applies to input from the subprocess, and output-coding applies to output to it.

User Option: auto-coding-functions

This variable holds a list of functions that try to determine a coding system for a file based on its undecoded contents.

Each function in this list should be written to look at text in the current buffer, but should not modify it in any way. The buffer will contain undecoded text of parts of the file. Each function should take one argument, size, which tells it how many characters to look at, starting from point. If the function succeeds in determining a coding system for the file, it should return that coding system. Otherwise, it should return nil.

If a file has a ‘coding:’ tag, that takes precedence, so these functions won’t be called.

Function: find-auto-coding filename size

This function tries to determine a suitable coding system for filename. It examines the buffer visiting the named file, using the variables documented above in sequence, until it finds a match for one of the rules specified by these variables. It then returns a cons cell of the form (coding . source), where coding is the coding system to use and source is a symbol, one of auto-coding-alist, auto-coding-regexp-alist, :coding, or auto-coding-functions, indicating which one supplied the matching rule. The value :coding means the coding system was specified by the coding: tag in the file (see coding tag in The GNU Emacs Manual). The order of looking for a matching rule is auto-coding-alist first, then auto-coding-regexp-alist, then the coding: tag, and lastly auto-coding-functions. If no matching rule was found, the function returns nil.

The second argument size is the size of text, in characters, following point. The function examines text only within size characters after point. Normally, the buffer should be positioned at the beginning when this function is called, because one of the places for the coding: tag is the first one or two lines of the file; in that case, size should be the size of the buffer.

Function: set-auto-coding filename size

This function returns a suitable coding system for file filename. It uses find-auto-coding to find the coding system. If no coding system could be determined, the function returns nil. The meaning of the argument size is like in find-auto-coding.

Function: find-operation-coding-system operation &rest arguments

This function returns the coding system to use (by default) for performing operation with arguments. The value has this form:

(decoding-system . encoding-system)

The first element, decoding-system, is the coding system to use for decoding (in case operation does decoding), and encoding-system is the coding system for encoding (in case operation does encoding).

The argument operation is a symbol; it should be one of write-region, start-process, call-process, call-process-region, insert-file-contents, or open-network-stream. These are the names of the Emacs I/O primitives that can do character code and eol conversion.

The remaining arguments should be the same arguments that might be given to the corresponding I/O primitive. Depending on the primitive, one of those arguments is selected as the target. For example, if operation does file I/O, whichever argument specifies the file name is the target. For subprocess primitives, the process name is the target. For open-network-stream, the target is the service name or port number.

Depending on operation, this function looks up the target in file-coding-system-alist, process-coding-system-alist, or network-coding-system-alist. If the target is found in the alist, find-operation-coding-system returns its association in the alist; otherwise it returns nil.

If operation is insert-file-contents, the argument corresponding to the target may be a cons cell of the form (filename . buffer). In that case, filename is a file name to look up in file-coding-system-alist, and buffer is a buffer that contains the file’s contents (not yet decoded). If file-coding-system-alist specifies a function to call for this file, and that function needs to examine the file’s contents (as it usually does), it should examine the contents of buffer instead of reading the file.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.6 Specifying a Coding System for One Operation

You can specify the coding system for a specific operation by binding the variables coding-system-for-read and/or coding-system-for-write.

Variable: coding-system-for-read

If this variable is non-nil, it specifies the coding system to use for reading a file, or for input from a synchronous subprocess.

It also applies to any asynchronous subprocess or network stream, but in a different way: the value of coding-system-for-read when you start the subprocess or open the network stream specifies the input decoding method for that subprocess or network stream. It remains in use for that subprocess or network stream unless and until overridden.

The right way to use this variable is to bind it with let for a specific I/O operation. Its global value is normally nil, and you should not globally set it to any other value. Here is an example of the right way to use the variable:

;; Read the file with no character code conversion.
(let ((coding-system-for-read 'no-conversion))
  (insert-file-contents filename))

When its value is non-nil, this variable takes precedence over all other methods of specifying a coding system to use for input, including file-coding-system-alist, process-coding-system-alist and network-coding-system-alist.

Variable: coding-system-for-write

This works much like coding-system-for-read, except that it applies to output rather than input. It affects writing to files, as well as sending output to subprocesses and net connections.

When a single operation does both input and output, as do call-process-region and start-process, both coding-system-for-read and coding-system-for-write affect it.

User Option: inhibit-eol-conversion

When this variable is non-nil, no end-of-line conversion is done, no matter which coding system is specified. This applies to all the Emacs I/O and subprocess primitives, and to the explicit encoding and decoding functions (see section Explicit Encoding and Decoding).

Sometimes, you need to prefer several coding systems for some operation, rather than fix a single one. Emacs lets you specify a priority order for using coding systems. This ordering affects the sorting of lists of coding systems returned by functions such as find-coding-systems-region (see section Coding Systems in Lisp).

Function: coding-system-priority-list &optional highestp

This function returns the list of coding systems in the order of their current priorities. Optional argument highestp, if non-nil, means return only the highest priority coding system.

Function: set-coding-system-priority &rest coding-systems

This function puts coding-systems at the beginning of the priority list for coding systems, thus making their priority higher than all the rest.

Macro: with-coding-priority coding-systems &rest body…

This macro execute body, like progn does (see section progn), with coding-systems at the front of the priority list for coding systems. coding-systems should be a list of coding systems to prefer during execution of body.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.7 Explicit Encoding and Decoding

All the operations that transfer text in and out of Emacs have the ability to use a coding system to encode or decode the text. You can also explicitly encode and decode text using the functions in this section.

The result of encoding, and the input to decoding, are not ordinary text. They logically consist of a series of byte values; that is, a series of ASCII and eight-bit characters. In unibyte buffers and strings, these characters have codes in the range 0 through #xFF (255). In a multibyte buffer or string, eight-bit characters have character codes higher than #xFF (see section Text Representations), but Emacs transparently converts them to their single-byte values when you encode or decode such text.

The usual way to read a file into a buffer as a sequence of bytes, so you can decode the contents explicitly, is with insert-file-contents-literally (see section Reading from Files); alternatively, specify a non-nil rawfile argument when visiting a file with find-file-noselect. These methods result in a unibyte buffer.

The usual way to use the byte sequence that results from explicitly encoding text is to copy it to a file or process—for example, to write it with write-region (see section Writing to Files), and suppress encoding by binding coding-system-for-write to no-conversion.

Here are the functions to perform explicit encoding or decoding. The encoding functions produce sequences of bytes; the decoding functions are meant to operate on sequences of bytes. All of these functions discard text properties. They also set last-coding-system-used to the precise coding system they used.

Command: encode-coding-region start end coding-system &optional destination

This command encodes the text from start to end according to coding system coding-system. Normally, the encoded text replaces the original text in the buffer, but the optional argument destination can change that. If destination is a buffer, the encoded text is inserted in that buffer after point (point does not move); if it is t, the command returns the encoded text as a unibyte string without inserting it.

If encoded text is inserted in some buffer, this command returns the length of the encoded text.

The result of encoding is logically a sequence of bytes, but the buffer remains multibyte if it was multibyte before, and any 8-bit bytes are converted to their multibyte representation (see section Text Representations).

Do not use undecided for coding-system when encoding text, since that may lead to unexpected results. Instead, use select-safe-coding-system (see section select-safe-coding-system) to suggest a suitable encoding, if there’s no obvious pertinent value for coding-system.

Function: encode-coding-string string coding-system &optional nocopy buffer

This function encodes the text in string according to coding system coding-system. It returns a new string containing the encoded text, except when nocopy is non-nil, in which case the function may return string itself if the encoding operation is trivial. The result of encoding is a unibyte string.

Command: decode-coding-region start end coding-system &optional destination

This command decodes the text from start to end according to coding system coding-system. To make explicit decoding useful, the text before decoding ought to be a sequence of byte values, but both multibyte and unibyte buffers are acceptable (in the multibyte case, the raw byte values should be represented as eight-bit characters). Normally, the decoded text replaces the original text in the buffer, but the optional argument destination can change that. If destination is a buffer, the decoded text is inserted in that buffer after point (point does not move); if it is t, the command returns the decoded text as a multibyte string without inserting it.

If decoded text is inserted in some buffer, this command returns the length of the decoded text.

This command puts a charset text property on the decoded text. The value of the property states the character set used to decode the original text.

Function: decode-coding-string string coding-system &optional nocopy buffer

This function decodes the text in string according to coding-system. It returns a new string containing the decoded text, except when nocopy is non-nil, in which case the function may return string itself if the decoding operation is trivial. To make explicit decoding useful, the contents of string ought to be a unibyte string with a sequence of byte values, but a multibyte string is also acceptable (assuming it contains 8-bit bytes in their multibyte form).

If optional argument buffer specifies a buffer, the decoded text is inserted in that buffer after point (point does not move). In this case, the return value is the length of the decoded text.

This function puts a charset text property on the decoded text. The value of the property states the character set used to decode the original text:

(decode-coding-string "Gr\374ss Gott" 'latin-1)
     ⇒ #("Grüss Gott" 0 9 (charset iso-8859-1))
Function: decode-coding-inserted-region from to filename &optional visit beg end replace

This function decodes the text from from to to as if it were being read from file filename using insert-file-contents using the rest of the arguments provided.

The normal way to use this function is after reading text from a file without decoding, if you decide you would rather have decoded it. Instead of deleting the text and reading it again, this time with decoding, you can call this function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.8 Terminal I/O Encoding

Emacs can use coding systems to decode keyboard input and encode terminal output. This is useful for terminals that transmit or display text using a particular encoding, such as Latin-1. Emacs does not set last-coding-system-used when encoding or decoding terminal I/O.

Function: keyboard-coding-system &optional terminal

This function returns the coding system used for decoding keyboard input from terminal. A value of no-conversion means no decoding is done. If terminal is omitted or nil, it means the selected frame’s terminal. See section Multiple Terminals.

Command: set-keyboard-coding-system coding-system &optional terminal

This command specifies coding-system as the coding system to use for decoding keyboard input from terminal. If coding-system is nil, that means not to decode keyboard input. If terminal is a frame, it means that frame’s terminal; if it is nil, that means the currently selected frame’s terminal. See section Multiple Terminals.

Function: terminal-coding-system &optional terminal

This function returns the coding system that is in use for encoding terminal output from terminal. A value of no-conversion means no encoding is done. If terminal is a frame, it means that frame’s terminal; if it is nil, that means the currently selected frame’s terminal.

Command: set-terminal-coding-system coding-system &optional terminal

This command specifies coding-system as the coding system to use for encoding terminal output from terminal. If coding-system is nil, that means not to encode terminal output. If terminal is a frame, it means that frame’s terminal; if it is nil, that means the currently selected frame’s terminal.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.11 Input Methods

Input methods provide convenient ways of entering non-ASCII characters from the keyboard. Unlike coding systems, which translate non-ASCII characters to and from encodings meant to be read by programs, input methods provide human-friendly commands. (See Input Methods in The GNU Emacs Manual, for information on how users use input methods to enter text.) How to define input methods is not yet documented in this manual, but here we describe how to use them.

Each input method has a name, which is currently a string; in the future, symbols may also be usable as input method names.

Variable: current-input-method

This variable holds the name of the input method now active in the current buffer. (It automatically becomes local in each buffer when set in any fashion.) It is nil if no input method is active in the buffer now.

User Option: default-input-method

This variable holds the default input method for commands that choose an input method. Unlike current-input-method, this variable is normally global.

Command: set-input-method input-method

This command activates input method input-method for the current buffer. It also sets default-input-method to input-method. If input-method is nil, this command deactivates any input method for the current buffer.

Function: read-input-method-name prompt &optional default inhibit-null

This function reads an input method name with the minibuffer, prompting with prompt. If default is non-nil, that is returned by default, if the user enters empty input. However, if inhibit-null is non-nil, empty input signals an error.

The returned value is a string.

Variable: input-method-alist

This variable defines all the supported input methods. Each element defines one input method, and should have the form:

(input-method language-env activate-func
 title description args...)

Here input-method is the input method name, a string; language-env is another string, the name of the language environment this input method is recommended for. (That serves only for documentation purposes.)

activate-func is a function to call to activate this method. The args, if any, are passed as arguments to activate-func. All told, the arguments to activate-func are input-method and the args.

title is a string to display in the mode line while this method is active. description is a string describing this method and what it is good for.

The fundamental interface to input methods is through the variable input-method-function. See section Reading One Event, and Invoking the Input Method.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.12 Locales

POSIX defines a concept of “locales” which control which language to use in language-related features. These Emacs variables control how Emacs interacts with these features.

Variable: locale-coding-system

This variable specifies the coding system to use for decoding system error messages and—on X Window system only—keyboard input, for encoding the format argument to format-time-string, and for decoding the return value of format-time-string.

Variable: system-messages-locale

This variable specifies the locale to use for generating system error messages. Changing the locale can cause messages to come out in a different language or in a different orthography. If the variable is nil, the locale is specified by environment variables in the usual POSIX fashion.

Variable: system-time-locale

This variable specifies the locale to use for formatting time values. Changing the locale can cause messages to appear according to the conventions of a different language. If the variable is nil, the locale is specified by environment variables in the usual POSIX fashion.

Function: locale-info item

This function returns locale data item for the current POSIX locale, if available. item should be one of these symbols:

codeset

Return the character set as a string (locale item CODESET).

days

Return a 7-element vector of day names (locale items DAY_1 through DAY_7);

months

Return a 12-element vector of month names (locale items MON_1 through MON_12).

paper

Return a list (width height) for the default paper size measured in millimeters (locale items PAPER_WIDTH and PAPER_HEIGHT).

If the system can’t provide the requested information, or if item is not one of those symbols, the value is nil. All strings in the return value are decoded using locale-coding-system. See Locales in The GNU Libc Manual, for more information about locales and locale items.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33 Searching and Matching

GNU Emacs provides two ways to search through a buffer for specified text: exact string searches and regular expression searches. After a regular expression search, you can examine the match data to determine which text matched the whole regular expression or various portions of it.

The ‘skip-chars…’ functions also perform a kind of searching. See section Skipping Characters. To search for changes in character properties, see Text Property Search Functions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.1 Searching for Strings

These are the primitive functions for searching through the text in a buffer. They are meant for use in programs, but you may call them interactively. If you do so, they prompt for the search string; the arguments limit and noerror are nil, and repeat is 1. For more details on interactive searching, see Searching and Replacement in The GNU Emacs Manual.

These search functions convert the search string to multibyte if the buffer is multibyte; they convert the search string to unibyte if the buffer is unibyte. See section Text Representations.

Command: search-forward string &optional limit noerror repeat

This function searches forward from point for an exact match for string. If successful, it sets point to the end of the occurrence found, and returns the new value of point. If no match is found, the value and side effects depend on noerror (see below).

In the following example, point is initially at the beginning of the line. Then (search-forward "fox") moves point after the last letter of ‘fox’:

---------- Buffer: foo ----------
∗The quick brown fox jumped over the lazy dog.
---------- Buffer: foo ----------
(search-forward "fox")
     ⇒ 20

---------- Buffer: foo ----------
The quick brown fox∗ jumped over the lazy dog.
---------- Buffer: foo ----------

The argument limit specifies the bound to the search, and should be a position in the current buffer. No match extending after that position is accepted. If limit is omitted or nil, it defaults to the end of the accessible portion of the buffer.

What happens when the search fails depends on the value of noerror. If noerror is nil, a search-failed error is signaled. If noerror is t, search-forward returns nil and does nothing. If noerror is neither nil nor t, then search-forward moves point to the upper bound and returns nil.

The argument noerror only affects valid searches which fail to find a match. Invalid arguments cause errors regardless of noerror.

If repeat is a positive number n, it serves as a repeat count: the search is repeated n times, each time starting at the end of the previous time’s match. If these successive searches succeed, the function succeeds, moving point and returning its new value. Otherwise the search fails, with results depending on the value of noerror, as described above. If repeat is a negative number -n, it serves as a repeat count of n for a search in the opposite (backward) direction.

Command: search-backward string &optional limit noerror repeat

This function searches backward from point for string. It is like search-forward, except that it searches backwards rather than forwards. Backward searches leave point at the beginning of the match.

Command: word-search-forward string &optional limit noerror repeat

This function searches forward from point for a “word” match for string. If it finds a match, it sets point to the end of the match found, and returns the new value of point.

Word matching regards string as a sequence of words, disregarding punctuation that separates them. It searches the buffer for the same sequence of words. Each word must be distinct in the buffer (searching for the word ‘ball’ does not match the word ‘balls’), but the details of punctuation and spacing are ignored (searching for ‘ball boy’ does match ‘ball. Boy!’).

In this example, point is initially at the beginning of the buffer; the search leaves it between the ‘y’ and the ‘!’.

---------- Buffer: foo ----------
∗He said "Please!  Find
the ball boy!"
---------- Buffer: foo ----------
(word-search-forward "Please find the ball, boy.")
     ⇒ 39

---------- Buffer: foo ----------
He said "Please!  Find
the ball boy∗!"
---------- Buffer: foo ----------

If limit is non-nil, it must be a position in the current buffer; it specifies the upper bound to the search. The match found must not extend after that position.

If noerror is nil, then word-search-forward signals an error if the search fails. If noerror is t, then it returns nil instead of signaling an error. If noerror is neither nil nor t, it moves point to limit (or the end of the accessible portion of the buffer) and returns nil.

If repeat is non-nil, then the search is repeated that many times. Point is positioned at the end of the last match.

Internally, word-search-forward and related functions use the function word-search-regexp to convert string to a regular expression that ignores punctuation.

Command: word-search-forward-lax string &optional limit noerror repeat

This command is identical to word-search-forward, except that the beginning or the end of string need not match a word boundary, unless string begins or ends in whitespace. For instance, searching for ‘ball boy’ matches ‘ball boyee’, but does not match ‘balls boy’.

Command: word-search-backward string &optional limit noerror repeat

This function searches backward from point for a word match to string. This function is just like word-search-forward except that it searches backward and normally leaves point at the beginning of the match.

Command: word-search-backward-lax string &optional limit noerror repeat

This command is identical to word-search-backward, except that the beginning or the end of string need not match a word boundary, unless string begins or ends in whitespace.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.2 Searching and Case

By default, searches in Emacs ignore the case of the text they are searching through; if you specify searching for ‘FOO’, then ‘Foo’ or ‘foo’ is also considered a match. This applies to regular expressions, too; thus, ‘[aB]’ would match ‘a’ or ‘A’ or ‘b’ or ‘B’.

If you do not want this feature, set the variable case-fold-search to nil. Then all letters must match exactly, including case. This is a buffer-local variable; altering the variable affects only the current buffer. (See section Introduction to Buffer-Local Variables.) Alternatively, you may change the default value. In Lisp code, you will more typically use let to bind case-fold-search to the desired value.

Note that the user-level incremental search feature handles case distinctions differently. When the search string contains only lower case letters, the search ignores case, but when the search string contains one or more upper case letters, the search becomes case-sensitive. But this has nothing to do with the searching functions used in Lisp code. See Incremental Search in The GNU Emacs Manual.

User Option: case-fold-search

This buffer-local variable determines whether searches should ignore case. If the variable is nil they do not ignore case; otherwise (and by default) they do ignore case.

User Option: case-replace

This variable determines whether the higher-level replacement functions should preserve case. If the variable is nil, that means to use the replacement text verbatim. A non-nil value means to convert the case of the replacement text according to the text being replaced.

This variable is used by passing it as an argument to the function replace-match. See section Replacing the Text that Matched.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3 Regular Expressions

A regular expression, or regexp for short, is a pattern that denotes a (possibly infinite) set of strings. Searching for matches for a regexp is a very powerful operation. This section explains how to write regexps; the following section says how to search for them.

For interactive development of regular expressions, you can use the M-x re-builder command. It provides a convenient interface for creating regular expressions, by giving immediate visual feedback in a separate buffer. As you edit the regexp, all its matches in the target buffer are highlighted. Each parenthesized sub-expression of the regexp is shown in a distinct face, which makes it easier to verify even very complex regexps.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.1 Syntax of Regular Expressions

Regular expressions have a syntax in which a few characters are special constructs and the rest are ordinary. An ordinary character is a simple regular expression that matches that character and nothing else. The special characters are ‘.’, ‘*’, ‘+’, ‘?’, ‘[’, ‘^’, ‘$’, and ‘\’; no new special characters will be defined in the future. The character ‘]’ is special if it ends a character alternative (see later). The character ‘-’ is special inside a character alternative. A ‘[:’ and balancing ‘:]’ enclose a character class inside a character alternative. Any other character appearing in a regular expression is ordinary, unless a ‘\’ precedes it.

For example, ‘f’ is not a special character, so it is ordinary, and therefore ‘f’ is a regular expression that matches the string ‘f’ and no other string. (It does not match the string ‘fg’, but it does match a part of that string.) Likewise, ‘o’ is a regular expression that matches only ‘o’.

Any two regular expressions a and b can be concatenated. The result is a regular expression that matches a string if a matches some amount of the beginning of that string and b matches the rest of the string.

As a simple example, we can concatenate the regular expressions ‘f’ and ‘o’ to get the regular expression ‘fo’, which matches only the string ‘fo’. Still trivial. To do something more powerful, you need to use one of the special regular expression constructs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.1.1 Special Characters in Regular Expressions

Here is a list of the characters that are special in a regular expression.

.(Period)

is a special character that matches any single character except a newline. Using concatenation, we can make regular expressions like ‘a.b’, which matches any three-character string that begins with ‘a’ and ends with ‘b’.

*

is not a construct by itself; it is a postfix operator that means to match the preceding regular expression repetitively as many times as possible. Thus, ‘o*’ matches any number of ‘o’s (including no ‘o’s).

*’ always applies to the smallest possible preceding expression. Thus, ‘fo*’ has a repeating ‘o’, not a repeating ‘fo’. It matches ‘f’, ‘fo’, ‘foo’, and so on.

The matcher processes a ‘*’ construct by matching, immediately, as many repetitions as can be found. Then it continues with the rest of the pattern. If that fails, backtracking occurs, discarding some of the matches of the ‘*’-modified construct in the hope that that will make it possible to match the rest of the pattern. For example, in matching ‘ca*ar’ against the string ‘caaar’, the ‘a*’ first tries to match all three ‘a’s; but the rest of the pattern is ‘ar’ and there is only ‘r’ left to match, so this try fails. The next alternative is for ‘a*’ to match only two ‘a’s. With this choice, the rest of the regexp matches successfully.

Warning: Nested repetition operators can run for an indefinitely long time, if they lead to ambiguous matching. For example, trying to match the regular expression ‘\(x+y*\)*a’ against the string ‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz’ could take hours before it ultimately fails. Emacs must try each way of grouping the ‘x’s before concluding that none of them can work. Even worse, ‘\(x*\)*’ can match the null string in infinitely many ways, so it causes an infinite loop. To avoid these problems, check nested repetitions carefully, to make sure that they do not cause combinatorial explosions in backtracking.

+

is a postfix operator, similar to ‘*’ except that it must match the preceding expression at least once. So, for example, ‘ca+r’ matches the strings ‘car’ and ‘caaaar’ but not the string ‘cr’, whereas ‘ca*r’ matches all three strings.

?

is a postfix operator, similar to ‘*’ except that it must match the preceding expression either once or not at all. For example, ‘ca?r’ matches ‘car’ or ‘cr’; nothing else.

*?’, ‘+?’, ‘??

These are “non-greedy” variants of the operators ‘*’, ‘+’ and ‘?’. Where those operators match the largest possible substring (consistent with matching the entire containing expression), the non-greedy variants match the smallest possible substring (consistent with matching the entire containing expression).

For example, the regular expression ‘c[ad]*a’ when applied to the string ‘cdaaada’ matches the whole string; but the regular expression ‘c[ad]*?a’, applied to that same string, matches just ‘cda’. (The smallest possible match here for ‘[ad]*?’ that permits the whole expression to match is ‘d’.)

[ … ]

is a character alternative, which begins with ‘[’ and is terminated by ‘]’. In the simplest case, the characters between the two brackets are what this character alternative can match.

Thus, ‘[ad]’ matches either one ‘a’ or one ‘d’, and ‘[ad]*’ matches any string composed of just ‘a’s and ‘d’s (including the empty string). It follows that ‘c[ad]*r’ matches ‘cr’, ‘car’, ‘cdr’, ‘caddaar’, etc.

You can also include character ranges in a character alternative, by writing the starting and ending characters with a ‘-’ between them. Thus, ‘[a-z]’ matches any lower-case ASCII letter. Ranges may be intermixed freely with individual characters, as in ‘[a-z$%.]’, which matches any lower case ASCII letter or ‘$’, ‘%’ or period.

If case-fold-search is non-nil, ‘[a-z]’ also matches upper-case letters. Note that a range like ‘[a-z]’ is not affected by the locale’s collation sequence, it always represents a sequence in ASCII order.

Note also that the usual regexp special characters are not special inside a character alternative. A completely different set of characters is special inside character alternatives: ‘]’, ‘-’ and ‘^’.

To include a ‘]’ in a character alternative, you must make it the first character. For example, ‘[]a]’ matches ‘]’ or ‘a’. To include a ‘-’, write ‘-’ as the first or last character of the character alternative, or put it after a range. Thus, ‘[]-]’ matches both ‘]’ and ‘-’. (As explained below, you cannot use ‘\]’ to include a ‘]’ inside a character alternative, since ‘\’ is not special there.)

To include ‘^’ in a character alternative, put it anywhere but at the beginning.

If a range starts with a unibyte character c and ends with a multibyte character c2, the range is divided into two parts: one spans the unibyte characters ‘c..?\377’, the other the multibyte characters ‘c1..c2’, where c1 is the first character of the charset to which c2 belongs.

A character alternative can also specify named character classes (see section Character Classes). This is a POSIX feature. For example, ‘[[:ascii:]]’ matches any ASCII character. Using a character class is equivalent to mentioning each of the characters in that class; but the latter is not feasible in practice, since some classes include thousands of different characters.

[^ … ]

[^’ begins a complemented character alternative. This matches any character except the ones specified. Thus, ‘[^a-z0-9A-Z]’ matches all characters except letters and digits.

^’ is not special in a character alternative unless it is the first character. The character following the ‘^’ is treated as if it were first (in other words, ‘-’ and ‘]’ are not special there).

A complemented character alternative can match a newline, unless newline is mentioned as one of the characters not to match. This is in contrast to the handling of regexps in programs such as grep.

You can specify named character classes, just like in character alternatives. For instance, ‘[^[:ascii:]]’ matches any non-ASCII character. See section Character Classes.

^

When matching a buffer, ‘^’ matches the empty string, but only at the beginning of a line in the text being matched (or the beginning of the accessible portion of the buffer). Otherwise it fails to match anything. Thus, ‘^foo’ matches a ‘foo’ that occurs at the beginning of a line.

When matching a string instead of a buffer, ‘^’ matches at the beginning of the string or after a newline character.

For historical compatibility reasons, ‘^’ can be used only at the beginning of the regular expression, or after ‘\(’, ‘\(?:’ or ‘\|’.

$

is similar to ‘^’ but matches only at the end of a line (or the end of the accessible portion of the buffer). Thus, ‘x+$’ matches a string of one ‘x’ or more at the end of a line.

When matching a string instead of a buffer, ‘$’ matches at the end of the string or before a newline character.

For historical compatibility reasons, ‘$’ can be used only at the end of the regular expression, or before ‘\)’ or ‘\|’.

\

has two functions: it quotes the special characters (including ‘\’), and it introduces additional special constructs.

Because ‘\’ quotes special characters, ‘\$’ is a regular expression that matches only ‘$’, and ‘\[’ is a regular expression that matches only ‘[’, and so on.

Note that ‘\’ also has special meaning in the read syntax of Lisp strings (see section String Type), and must be quoted with ‘\’. For example, the regular expression that matches the ‘\’ character is ‘\\’. To write a Lisp string that contains the characters ‘\\’, Lisp syntax requires you to quote each ‘\’ with another ‘\’. Therefore, the read syntax for a regular expression matching ‘\’ is "\\\\".

Please note: For historical compatibility, special characters are treated as ordinary ones if they are in contexts where their special meanings make no sense. For example, ‘*foo’ treats ‘*’ as ordinary since there is no preceding expression on which the ‘*’ can act. It is poor practice to depend on this behavior; quote the special character anyway, regardless of where it appears.

As a ‘\’ is not special inside a character alternative, it can never remove the special meaning of ‘-’ or ‘]’. So you should not quote these characters when they have no special meaning either. This would not clarify anything, since backslashes can legitimately precede these characters where they have special meaning, as in ‘[^\]’ ("[^\\]" for Lisp string syntax), which matches any single character except a backslash.

In practice, most ‘]’ that occur in regular expressions close a character alternative and hence are special. However, occasionally a regular expression may try to match a complex pattern of literal ‘[’ and ‘]’. In such situations, it sometimes may be necessary to carefully parse the regexp from the start to determine which square brackets enclose a character alternative. For example, ‘[^][]]’ consists of the complemented character alternative ‘[^][]’ (which matches any single character that is not a square bracket), followed by a literal ‘]’.

The exact rules are that at the beginning of a regexp, ‘[’ is special and ‘]’ not. This lasts until the first unquoted ‘[’, after which we are in a character alternative; ‘[’ is no longer special (except when it starts a character class) but ‘]’ is special, unless it immediately follows the special ‘[’ or that ‘[’ followed by a ‘^’. This lasts until the next special ‘]’ that does not end a character class. This ends the character alternative and restores the ordinary syntax of regular expressions; an unquoted ‘[’ is special again and a ‘]’ not.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.1.2 Character Classes

Here is a table of the classes you can use in a character alternative, and what they mean:

[:ascii:]

This matches any ASCII character (codes 0–127).

[:alnum:]

This matches any letter or digit. (At present, for multibyte characters, it matches anything that has word syntax.)

[:alpha:]

This matches any letter. (At present, for multibyte characters, it matches anything that has word syntax.)

[:blank:]

This matches space and tab only.

[:cntrl:]

This matches any ASCII control character.

[:digit:]

This matches ‘0’ through ‘9’. Thus, ‘[-+[:digit:]]’ matches any digit, as well as ‘+’ and ‘-’.

[:graph:]

This matches graphic characters—everything except ASCII control characters, space, and the delete character.

[:lower:]

This matches any lower-case letter, as determined by the current case table (see section The Case Table). If case-fold-search is non-nil, this also matches any upper-case letter.

[:multibyte:]

This matches any multibyte character (see section Text Representations).

[:nonascii:]

This matches any non-ASCII character.

[:print:]

This matches printing characters—everything except ASCII control characters and the delete character.

[:punct:]

This matches any punctuation character. (At present, for multibyte characters, it matches anything that has non-word syntax.)

[:space:]

This matches any character that has whitespace syntax (see section Table of Syntax Classes).

[:unibyte:]

This matches any unibyte character (see section Text Representations).

[:upper:]

This matches any upper-case letter, as determined by the current case table (see section The Case Table). If case-fold-search is non-nil, this also matches any lower-case letter.

[:word:]

This matches any character that has word syntax (see section Table of Syntax Classes).

[:xdigit:]

This matches the hexadecimal digits: ‘0’ through ‘9’, ‘a’ through ‘f’ and ‘A’ through ‘F’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.1.3 Backslash Constructs in Regular Expressions

For the most part, ‘\’ followed by any character matches only that character. However, there are several exceptions: certain sequences starting with ‘\’ that have special meanings. Here is a table of the special ‘\’ constructs.

\|

specifies an alternative. Two regular expressions a and b with ‘\|’ in between form an expression that matches anything that either a or b matches.

Thus, ‘foo\|bar’ matches either ‘foo’ or ‘bar’ but no other string.

\|’ applies to the largest possible surrounding expressions. Only a surrounding ‘\( … \)’ grouping can limit the grouping power of ‘\|’.

If you need full backtracking capability to handle multiple uses of ‘\|’, use the POSIX regular expression functions (see section POSIX Regular Expression Searching).

\{m\}

is a postfix operator that repeats the previous pattern exactly m times. Thus, ‘x\{5\}’ matches the string ‘xxxxx’ and nothing else. ‘c[ad]\{3\}r’ matches string such as ‘caaar’, ‘cdddr’, ‘cadar’, and so on.

\{m,n\}

is a more general postfix operator that specifies repetition with a minimum of m repeats and a maximum of n repeats. If m is omitted, the minimum is 0; if n is omitted, there is no maximum.

For example, ‘c[ad]\{1,2\}r’ matches the strings ‘car’, ‘cdr’, ‘caar’, ‘cadr’, ‘cdar’, and ‘cddr’, and nothing else.
\{0,1\}’ or ‘\{,1\}’ is equivalent to ‘?’.
\{0,\}’ or ‘\{,\}’ is equivalent to ‘*’.
\{1,\}’ is equivalent to ‘+’.

\( … \)

is a grouping construct that serves three purposes:

  1. To enclose a set of ‘\|’ alternatives for other operations. Thus, the regular expression ‘\(foo\|bar\)x’ matches either ‘foox’ or ‘barx’.
  2. To enclose a complicated expression for the postfix operators ‘*’, ‘+’ and ‘?’ to operate on. Thus, ‘ba\(na\)*’ matches ‘ba’, ‘bana’, ‘banana’, ‘bananana’, etc., with any number (zero or more) of ‘na’ strings.
  3. To record a matched substring for future reference with ‘\digit’ (see below).

This last application is not a consequence of the idea of a parenthetical grouping; it is a separate feature that was assigned as a second meaning to the same ‘\( … \)’ construct because, in practice, there was usually no conflict between the two meanings. But occasionally there is a conflict, and that led to the introduction of shy groups.

\(?: … \)

is the shy group construct. A shy group serves the first two purposes of an ordinary group (controlling the nesting of other operators), but it does not get a number, so you cannot refer back to its value with ‘\digit’. Shy groups are particularly useful for mechanically-constructed regular expressions, because they can be added automatically without altering the numbering of ordinary, non-shy groups.

Shy groups are also called non-capturing or unnumbered groups.

\(?num: … \)

is the explicitly numbered group construct. Normal groups get their number implicitly, based on their position, which can be inconvenient. This construct allows you to force a particular group number. There is no particular restriction on the numbering, e.g., you can have several groups with the same number in which case the last one to match (i.e., the rightmost match) will win. Implicitly numbered groups always get the smallest integer larger than the one of any previous group.

\digit

matches the same text that matched the digitth occurrence of a grouping (‘\( … \)’) construct.

In other words, after the end of a group, the matcher remembers the beginning and end of the text matched by that group. Later on in the regular expression you can use ‘\’ followed by digit to match that same text, whatever it may have been.

The strings matching the first nine grouping constructs appearing in the entire regular expression passed to a search or matching function are assigned numbers 1 through 9 in the order that the open parentheses appear in the regular expression. So you can use ‘\1’ through ‘\9’ to refer to the text matched by the corresponding grouping constructs.

For example, ‘\(.*\)\1’ matches any newline-free string that is composed of two identical halves. The ‘\(.*\)’ matches the first half, which may be anything, but the ‘\1’ that follows must match the same exact text.

If a ‘\( … \)’ construct matches more than once (which can happen, for instance, if it is followed by ‘*’), only the last match is recorded.

If a particular grouping construct in the regular expression was never matched—for instance, if it appears inside of an alternative that wasn’t used, or inside of a repetition that repeated zero times—then the corresponding ‘\digit’ construct never matches anything. To use an artificial example, ‘\(foo\(b*\)\|lose\)\2’ cannot match ‘lose’: the second alternative inside the larger group matches it, but then ‘\2’ is undefined and can’t match anything. But it can match ‘foobb’, because the first alternative matches ‘foob’ and ‘\2’ matches ‘b’.

\w

matches any word-constituent character. The editor syntax table determines which characters these are. See section Syntax Tables.

\W

matches any character that is not a word constituent.

\scode

matches any character whose syntax is code. Here code is a character that represents a syntax code: thus, ‘w’ for word constituent, ‘-’ for whitespace, ‘(’ for open parenthesis, etc. To represent whitespace syntax, use either ‘-’ or a space character. See section Table of Syntax Classes, for a list of syntax codes and the characters that stand for them.

\Scode

matches any character whose syntax is not code.

\cc

matches any character whose category is c. Here c is a character that represents a category: thus, ‘c’ for Chinese characters or ‘g’ for Greek characters in the standard category table. You can see the list of all the currently defined categories with M-x describe-categories RET. You can also define your own categories in addition to the standard ones using the define-category function (see section Categories).

\Cc

matches any character whose category is not c.

The following regular expression constructs match the empty string—that is, they don’t use up any characters—but whether they match depends on the context. For all, the beginning and end of the accessible portion of the buffer are treated as if they were the actual beginning and end of the buffer.

\`

matches the empty string, but only at the beginning of the buffer or string being matched against.

\'

matches the empty string, but only at the end of the buffer or string being matched against.

\=

matches the empty string, but only at point. (This construct is not defined when matching against a string.)

\b

matches the empty string, but only at the beginning or end of a word. Thus, ‘\bfoo\b’ matches any occurrence of ‘foo’ as a separate word. ‘\bballs?\b’ matches ‘ball’ or ‘balls’ as a separate word.

\b’ matches at the beginning or end of the buffer (or string) regardless of what text appears next to it.

\B

matches the empty string, but not at the beginning or end of a word, nor at the beginning or end of the buffer (or string).

\<

matches the empty string, but only at the beginning of a word. ‘\<’ matches at the beginning of the buffer (or string) only if a word-constituent character follows.

\>

matches the empty string, but only at the end of a word. ‘\>’ matches at the end of the buffer (or string) only if the contents end with a word-constituent character.

\_<

matches the empty string, but only at the beginning of a symbol. A symbol is a sequence of one or more word or symbol constituent characters. ‘\_<’ matches at the beginning of the buffer (or string) only if a symbol-constituent character follows.

\_>

matches the empty string, but only at the end of a symbol. ‘\_>’ matches at the end of the buffer (or string) only if the contents end with a symbol-constituent character.

Not every string is a valid regular expression. For example, a string that ends inside a character alternative without a terminating ‘]’ is invalid, and so is a string that ends with a single ‘\’. If an invalid regular expression is passed to any of the search functions, an invalid-regexp error is signaled.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.2 Complex Regexp Example

Here is a complicated regexp which was formerly used by Emacs to recognize the end of a sentence together with any whitespace that follows. (Nowadays Emacs uses a similar but more complex default regexp constructed by the function sentence-end. See section Standard Regular Expressions Used in Editing.)

Below, we show first the regexp as a string in Lisp syntax (to distinguish spaces from tab characters), and then the result of evaluating it. The string constant begins and ends with a double-quote. ‘\"’ stands for a double-quote as part of the string, ‘\\’ for a backslash as part of the string, ‘\t’ for a tab and ‘\n’ for a newline.

"[.?!][]\"')}]*\\($\\| $\\|\t\\|  \\)[ \t\n]*"
     ⇒ "[.?!][]\"')}]*\\($\\| $\\|  \\|  \\)[
]*"

In the output, tab and newline appear as themselves.

This regular expression contains four parts in succession and can be deciphered as follows:

[.?!]

The first part of the pattern is a character alternative that matches any one of three characters: period, question mark, and exclamation mark. The match must begin with one of these three characters. (This is one point where the new default regexp used by Emacs differs from the old. The new value also allows some non-ASCII characters that end a sentence without any following whitespace.)

[]\"')}]*

The second part of the pattern matches any closing braces and quotation marks, zero or more of them, that may follow the period, question mark or exclamation mark. The \" is Lisp syntax for a double-quote in a string. The ‘*’ at the end indicates that the immediately preceding regular expression (a character alternative, in this case) may be repeated zero or more times.

\\($\\| $\\|\t\\|  \\)

The third part of the pattern matches the whitespace that follows the end of a sentence: the end of a line (optionally with a space), or a tab, or two spaces. The double backslashes mark the parentheses and vertical bars as regular expression syntax; the parentheses delimit a group and the vertical bars separate alternatives. The dollar sign is used to match the end of a line.

[ \t\n]*

Finally, the last part of the pattern matches any additional whitespace beyond the minimum needed to end a sentence.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.3 Regular Expression Functions

These functions operate on regular expressions.

Function: regexp-quote string

This function returns a regular expression whose only exact match is string. Using this regular expression in looking-at will succeed only if the next characters in the buffer are string; using it in a search function will succeed if the text being searched contains string. See section Regular Expression Searching.

This allows you to request an exact string match or search when calling a function that wants a regular expression.

(regexp-quote "^The cat$")
     ⇒ "\\^The cat\\$"

One use of regexp-quote is to combine an exact string match with context described as a regular expression. For example, this searches for the string that is the value of string, surrounded by whitespace:

(re-search-forward
 (concat "\\s-" (regexp-quote string) "\\s-"))
Function: regexp-opt strings &optional paren

This function returns an efficient regular expression that will match any of the strings in the list strings. This is useful when you need to make matching or searching as fast as possible—for example, for Font Lock mode17.

If the optional argument paren is non-nil, then the returned regular expression is always enclosed by at least one parentheses-grouping construct. If paren is words, then that construct is additionally surrounded by ‘\<’ and ‘\>’; alternatively, if paren is symbols, then that construct is additionally surrounded by ‘\_<’ and ‘\_>’ (symbols is often appropriate when matching programming-language keywords and the like).

This simplified definition of regexp-opt produces a regular expression which is equivalent to the actual value (but not as efficient):

(defun regexp-opt (strings &optional paren)
  (let ((open-paren (if paren "\\(" ""))
        (close-paren (if paren "\\)" "")))
    (concat open-paren
            (mapconcat 'regexp-quote strings "\\|")
            close-paren)))
Function: regexp-opt-depth regexp

This function returns the total number of grouping constructs (parenthesized expressions) in regexp. This does not include shy groups (see section Backslash Constructs in Regular Expressions).

Function: regexp-opt-charset chars

This function returns a regular expression matching a character in the list of characters chars.

(regexp-opt-charset '(?a ?b ?c ?d ?e))
     ⇒ "[a-e]"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.4 Regular Expression Searching

In GNU Emacs, you can search for the next match for a regular expression (see section Syntax of Regular Expressions) either incrementally or not. For incremental search commands, see Regular Expression Search in The GNU Emacs Manual. Here we describe only the search functions useful in programs. The principal one is re-search-forward.

These search functions convert the regular expression to multibyte if the buffer is multibyte; they convert the regular expression to unibyte if the buffer is unibyte. See section Text Representations.

Command: re-search-forward regexp &optional limit noerror repeat

This function searches forward in the current buffer for a string of text that is matched by the regular expression regexp. The function skips over any amount of text that is not matched by regexp, and leaves point at the end of the first match found. It returns the new value of point.

If limit is non-nil, it must be a position in the current buffer. It specifies the upper bound to the search. No match extending after that position is accepted.

If repeat is supplied, it must be a positive number; the search is repeated that many times; each repetition starts at the end of the previous match. If all these successive searches succeed, the search succeeds, moving point and returning its new value. Otherwise the search fails. What re-search-forward does when the search fails depends on the value of noerror:

nil

Signal a search-failed error.

t

Do nothing and return nil.

anything else

Move point to limit (or the end of the accessible portion of the buffer) and return nil.

In the following example, point is initially before the ‘T’. Evaluating the search call moves point to the end of that line (between the ‘t’ of ‘hat’ and the newline).

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------
(re-search-forward "[a-z]+" nil t 5)
     ⇒ 27

---------- Buffer: foo ----------
I read "The cat in the hat∗
comes back" twice.
---------- Buffer: foo ----------
Command: re-search-backward regexp &optional limit noerror repeat

This function searches backward in the current buffer for a string of text that is matched by the regular expression regexp, leaving point at the beginning of the first text found.

This function is analogous to re-search-forward, but they are not simple mirror images. re-search-forward finds the match whose beginning is as close as possible to the starting point. If re-search-backward were a perfect mirror image, it would find the match whose end is as close as possible. However, in fact it finds the match whose beginning is as close as possible (and yet ends before the starting point). The reason for this is that matching a regular expression at a given spot always works from beginning to end, and starts at a specified beginning position.

A true mirror-image of re-search-forward would require a special feature for matching regular expressions from end to beginning. It’s not worth the trouble of implementing that.

Function: string-match regexp string &optional start

This function returns the index of the start of the first match for the regular expression regexp in string, or nil if there is no match. If start is non-nil, the search starts at that index in string.

For example,

(string-match
 "quick" "The quick brown fox jumped quickly.")
     ⇒ 4
(string-match
 "quick" "The quick brown fox jumped quickly." 8)
     ⇒ 27

The index of the first character of the string is 0, the index of the second character is 1, and so on.

After this function returns, the index of the first character beyond the match is available as (match-end 0). See section The Match Data.

(string-match
 "quick" "The quick brown fox jumped quickly." 8)
     ⇒ 27
(match-end 0)
     ⇒ 32
Function: string-match-p regexp string &optional start

This predicate function does what string-match does, but it avoids modifying the match data.

Function: looking-at regexp

This function determines whether the text in the current buffer directly following point matches the regular expression regexp. “Directly following” means precisely that: the search is “anchored” and it can succeed only starting with the first character following point. The result is t if so, nil otherwise.

This function does not move point, but it does update the match data. See section The Match Data. If you need to test for a match without modifying the match data, use looking-at-p, described below.

In this example, point is located directly before the ‘T’. If it were anywhere else, the result would be nil.

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(looking-at "The cat in the hat$")
     ⇒ t
Function: looking-back regexp &optional limit greedy

This function returns t if regexp matches the text immediately before point (i.e., ending at point), and nil otherwise.

Because regular expression matching works only going forward, this is implemented by searching backwards from point for a match that ends at point. That can be quite slow if it has to search a long distance. You can bound the time required by specifying limit, which says not to search before limit. In this case, the match that is found must begin at or after limit. Here’s an example:

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(looking-back "read \"" 3)
     ⇒ t
(looking-back "read \"" 4)
     ⇒ nil

If greedy is non-nil, this function extends the match backwards as far as possible, stopping when a single additional previous character cannot be part of a match for regexp. When the match is extended, its starting position is allowed to occur before limit.

As a general recommendation, try to avoid using looking-back wherever possible, since it is slow. For this reason, there are no plans to add a looking-back-p function.

Function: looking-at-p regexp

This predicate function works like looking-at, but without updating the match data.

Variable: search-spaces-regexp

If this variable is non-nil, it should be a regular expression that says how to search for whitespace. In that case, any group of spaces in a regular expression being searched for stands for use of this regular expression. However, spaces inside of constructs such as ‘[…]’ and ‘*’, ‘+’, ‘?’ are not affected by search-spaces-regexp.

Since this variable affects all regular expression search and match constructs, you should bind it temporarily for as small as possible a part of the code.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.5 POSIX Regular Expression Searching

The usual regular expression functions do backtracking when necessary to handle the ‘\|’ and repetition constructs, but they continue this only until they find some match. Then they succeed and report the first match found.

This section describes alternative search functions which perform the full backtracking specified by the POSIX standard for regular expression matching. They continue backtracking until they have tried all possibilities and found all matches, so they can report the longest match, as required by POSIX. This is much slower, so use these functions only when you really need the longest match.

The POSIX search and match functions do not properly support the non-greedy repetition operators (see section non-greedy). This is because POSIX backtracking conflicts with the semantics of non-greedy repetition.

Command: posix-search-forward regexp &optional limit noerror repeat

This is like re-search-forward except that it performs the full backtracking specified by the POSIX standard for regular expression matching.

Command: posix-search-backward regexp &optional limit noerror repeat

This is like re-search-backward except that it performs the full backtracking specified by the POSIX standard for regular expression matching.

Function: posix-looking-at regexp

This is like looking-at except that it performs the full backtracking specified by the POSIX standard for regular expression matching.

Function: posix-string-match regexp string &optional start

This is like string-match except that it performs the full backtracking specified by the POSIX standard for regular expression matching.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6 The Match Data

Emacs keeps track of the start and end positions of the segments of text found during a search; this is called the match data. Thanks to the match data, you can search for a complex pattern, such as a date in a mail message, and then extract parts of the match under control of the pattern.

Because the match data normally describe the most recent search only, you must be careful not to do another search inadvertently between the search you wish to refer back to and the use of the match data. If you can’t avoid another intervening search, you must save and restore the match data around it, to prevent it from being overwritten.

Notice that all functions are allowed to overwrite the match data unless they’re explicitly documented not to do so. A consequence is that functions that are run implicitly in the background (see section Timers for Delayed Execution, and Idle Timers) should likely save and restore the match data explicitly.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6.1 Replacing the Text that Matched

This function replaces all or part of the text matched by the last search. It works by means of the match data.

Function: replace-match replacement &optional fixedcase literal string subexp

This function performs a replacement operation on a buffer or string.

If you did the last search in a buffer, you should omit the string argument or specify nil for it, and make sure that the current buffer is the one in which you performed the last search. Then this function edits the buffer, replacing the matched text with replacement. It leaves point at the end of the replacement text.

If you performed the last search on a string, pass the same string as string. Then this function returns a new string, in which the matched text is replaced by replacement.

If fixedcase is non-nil, then replace-match uses the replacement text without case conversion; otherwise, it converts the replacement text depending upon the capitalization of the text to be replaced. If the original text is all upper case, this converts the replacement text to upper case. If all words of the original text are capitalized, this capitalizes all the words of the replacement text. If all the words are one-letter and they are all upper case, they are treated as capitalized words rather than all-upper-case words.

If literal is non-nil, then replacement is inserted exactly as it is, the only alterations being case changes as needed. If it is nil (the default), then the character ‘\’ is treated specially. If a ‘\’ appears in replacement, then it must be part of one of the following sequences:

\&

This stands for the entire text being replaced.

\n’, where n is a digit

This stands for the text that matched the nth subexpression in the original regexp. Subexpressions are those expressions grouped inside ‘\(…\)’. If the nth subexpression never matched, an empty string is substituted.

\\

This stands for a single ‘\’ in the replacement text.

\?

This stands for itself (for compatibility with replace-regexp and related commands; see Regexp Replace in The GNU Emacs Manual).

Any other character following ‘\’ signals an error.

The substitutions performed by ‘\&’ and ‘\n’ occur after case conversion, if any. Therefore, the strings they substitute are never case-converted.

If subexp is non-nil, that says to replace just subexpression number subexp of the regexp that was matched, not the entire match. For example, after matching ‘foo \(ba*r\)’, calling replace-match with 1 as subexp means to replace just the text that matched ‘\(ba*r\)’.

Function: match-substitute-replacement replacement &optional fixedcase literal string subexp

This function returns the text that would be inserted into the buffer by replace-match, but without modifying the buffer. It is useful if you want to present the user with actual replacement result, with constructs like ‘\n’ or ‘\&’ substituted with matched groups. Arguments replacement and optional fixedcase, literal, string and subexp have the same meaning as for replace-match.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6.2 Simple Match Data Access

This section explains how to use the match data to find out what was matched by the last search or match operation, if it succeeded.

You can ask about the entire matching text, or about a particular parenthetical subexpression of a regular expression. The count argument in the functions below specifies which. If count is zero, you are asking about the entire match. If count is positive, it specifies which subexpression you want.

Recall that the subexpressions of a regular expression are those expressions grouped with escaped parentheses, ‘\(…\)’. The countth subexpression is found by counting occurrences of ‘\(’ from the beginning of the whole regular expression. The first subexpression is numbered 1, the second 2, and so on. Only regular expressions can have subexpressions—after a simple string search, the only information available is about the entire match.

Every successful search sets the match data. Therefore, you should query the match data immediately after searching, before calling any other function that might perform another search. Alternatively, you may save and restore the match data (see section Saving and Restoring the Match Data) around the call to functions that could perform another search. Or use the functions that explicitly do not modify the match data; e.g., string-match-p.

A search which fails may or may not alter the match data. In the current implementation, it does not, but we may change it in the future. Don’t try to rely on the value of the match data after a failing search.

Function: match-string count &optional in-string

This function returns, as a string, the text matched in the last search or match operation. It returns the entire text if count is zero, or just the portion corresponding to the countth parenthetical subexpression, if count is positive.

If the last such operation was done against a string with string-match, then you should pass the same string as the argument in-string. After a buffer search or match, you should omit in-string or pass nil for it; but you should make sure that the current buffer when you call match-string is the one in which you did the searching or matching. Failure to follow this advice will lead to incorrect results.

The value is nil if count is out of range, or for a subexpression inside a ‘\|’ alternative that wasn’t used or a repetition that repeated zero times.

Function: match-string-no-properties count &optional in-string

This function is like match-string except that the result has no text properties.

Function: match-beginning count

This function returns the position of the start of the text matched by the last regular expression searched for, or a subexpression of it.

If count is zero, then the value is the position of the start of the entire match. Otherwise, count specifies a subexpression in the regular expression, and the value of the function is the starting position of the match for that subexpression.

The value is nil for a subexpression inside a ‘\|’ alternative that wasn’t used or a repetition that repeated zero times.

Function: match-end count

This function is like match-beginning except that it returns the position of the end of the match, rather than the position of the beginning.

Here is an example of using the match data, with a comment showing the positions within the text:

(string-match "\\(qu\\)\\(ick\\)"
              "The quick fox jumped quickly.")
              ;0123456789
     ⇒ 4
(match-string 0 "The quick fox jumped quickly.")
     ⇒ "quick"
(match-string 1 "The quick fox jumped quickly.")
     ⇒ "qu"
(match-string 2 "The quick fox jumped quickly.")
     ⇒ "ick"
(match-beginning 1)       ; The beginning of the match
     ⇒ 4                 ;   with ‘qu’ is at index 4.
(match-beginning 2)       ; The beginning of the match
     ⇒ 6                 ;   with ‘ick’ is at index 6.
(match-end 1)             ; The end of the match
     ⇒ 6                 ;   with ‘qu’ is at index 6.

(match-end 2)             ; The end of the match
     ⇒ 9                 ;   with ‘ick’ is at index 9.

Here is another example. Point is initially located at the beginning of the line. Searching moves point to between the space and the word ‘in’. The beginning of the entire match is at the 9th character of the buffer (‘T’), and the beginning of the match for the first subexpression is at the 13th character (‘c’).

(list
  (re-search-forward "The \\(cat \\)")
  (match-beginning 0)
  (match-beginning 1))
    ⇒ (17 9 13)
---------- Buffer: foo ----------
I read "The cat ∗in the hat comes back" twice.
        ^   ^
        9  13
---------- Buffer: foo ----------

(In this case, the index returned is a buffer position; the first character of the buffer counts as 1.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6.3 Accessing the Entire Match Data

The functions match-data and set-match-data read or write the entire match data, all at once.

Function: match-data &optional integers reuse reseat

This function returns a list of positions (markers or integers) that record all the information on the text that the last search matched. Element zero is the position of the beginning of the match for the whole expression; element one is the position of the end of the match for the expression. The next two elements are the positions of the beginning and end of the match for the first subexpression, and so on. In general, element number 2n corresponds to (match-beginning n); and element number 2n + 1 corresponds to (match-end n).

Normally all the elements are markers or nil, but if integers is non-nil, that means to use integers instead of markers. (In that case, the buffer itself is appended as an additional element at the end of the list, to facilitate complete restoration of the match data.) If the last match was done on a string with string-match, then integers are always used, since markers can’t point into a string.

If reuse is non-nil, it should be a list. In that case, match-data stores the match data in reuse. That is, reuse is destructively modified. reuse does not need to have the right length. If it is not long enough to contain the match data, it is extended. If it is too long, the length of reuse stays the same, but the elements that were not used are set to nil. The purpose of this feature is to reduce the need for garbage collection.

If reseat is non-nil, all markers on the reuse list are reseated to point to nowhere.

As always, there must be no possibility of intervening searches between the call to a search function and the call to match-data that is intended to access the match data for that search.

(match-data)
     ⇒  (#<marker at 9 in foo>
          #<marker at 17 in foo>
          #<marker at 13 in foo>
          #<marker at 17 in foo>)
Function: set-match-data match-list &optional reseat

This function sets the match data from the elements of match-list, which should be a list that was the value of a previous call to match-data. (More precisely, anything that has the same format will work.)

If match-list refers to a buffer that doesn’t exist, you don’t get an error; that sets the match data in a meaningless but harmless way.

If reseat is non-nil, all markers on the match-list list are reseated to point to nowhere.

store-match-data is a semi-obsolete alias for set-match-data.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6.4 Saving and Restoring the Match Data

When you call a function that may search, you may need to save and restore the match data around that call, if you want to preserve the match data from an earlier search for later use. Here is an example that shows the problem that arises if you fail to save the match data:

(re-search-forward "The \\(cat \\)")
     ⇒ 48
(foo)                   ; foo does more searching.
(match-end 0)
     ⇒ 61              ; Unexpected result—not 48!

You can save and restore the match data with save-match-data:

Macro: save-match-data body…

This macro executes body, saving and restoring the match data around it. The return value is the value of the last form in body.

You could use set-match-data together with match-data to imitate the effect of the special form save-match-data. Here is how:

(let ((data (match-data)))
  (unwind-protect
      …   ; Ok to change the original match data.
    (set-match-data data)))

Emacs automatically saves and restores the match data when it runs process filter functions (see section Process Filter Functions) and process sentinels (see section Sentinels: Detecting Process Status Changes).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.7 Search and Replace

If you want to find all matches for a regexp in part of the buffer, and replace them, the best way is to write an explicit loop using re-search-forward and replace-match, like this:

(while (re-search-forward "foo[ \t]+bar" nil t)
  (replace-match "foobar"))

See section Replacing the Text that Matched, for a description of replace-match.

However, replacing matches in a string is more complex, especially if you want to do it efficiently. So Emacs provides a function to do this.

Function: replace-regexp-in-string regexp rep string &optional fixedcase literal subexp start

This function copies string and searches it for matches for regexp, and replaces them with rep. It returns the modified copy. If start is non-nil, the search for matches starts at that index in string, so matches starting before that index are not changed.

This function uses replace-match to do the replacement, and it passes the optional arguments fixedcase, literal and subexp along to replace-match.

Instead of a string, rep can be a function. In that case, replace-regexp-in-string calls rep for each match, passing the text of the match as its sole argument. It collects the value rep returns and passes that to replace-match as the replacement string. The match data at this point are the result of matching regexp against a substring of string.

If you want to write a command along the lines of query-replace, you can use perform-replace to do the work.

Function: perform-replace from-string replacements query-flag regexp-flag delimited-flag &optional repeat-count map start end

This function is the guts of query-replace and related commands. It searches for occurrences of from-string in the text between positions start and end and replaces some or all of them. If start is nil (or omitted), point is used instead, and the end of the buffer’s accessible portion is used for end.

If query-flag is nil, it replaces all occurrences; otherwise, it asks the user what to do about each one.

If regexp-flag is non-nil, then from-string is considered a regular expression; otherwise, it must match literally. If delimited-flag is non-nil, then only replacements surrounded by word boundaries are considered.

The argument replacements specifies what to replace occurrences with. If it is a string, that string is used. It can also be a list of strings, to be used in cyclic order.

If replacements is a cons cell, (function . data), this means to call function after each match to get the replacement text. This function is called with two arguments: data, and the number of replacements already made.

If repeat-count is non-nil, it should be an integer. Then it specifies how many times to use each of the strings in the replacements list before advancing cyclically to the next one.

If from-string contains upper-case letters, then perform-replace binds case-fold-search to nil, and it uses the replacements without altering their case.

Normally, the keymap query-replace-map defines the possible user responses for queries. The argument map, if non-nil, specifies a keymap to use instead of query-replace-map.

This function uses one of two functions to search for the next occurrence of from-string. These functions are specified by the values of two variables: replace-re-search-function and replace-search-function. The former is called when the argument regexp-flag is non-nil, the latter when it is nil.

Variable: query-replace-map

This variable holds a special keymap that defines the valid user responses for perform-replace and the commands that use it, as well as y-or-n-p and map-y-or-n-p. This map is unusual in two ways:

Here are the meaningful “bindings” for query-replace-map. Several of them are meaningful only for query-replace and friends.

act

Do take the action being considered—in other words, “yes”.

skip

Do not take action for this question—in other words, “no”.

exit

Answer this question “no”, and give up on the entire series of questions, assuming that the answers will be “no”.

exit-prefix

Like exit, but add the key that was pressed to unread-command-events (see section Miscellaneous Event Input Features).

act-and-exit

Answer this question “yes”, and give up on the entire series of questions, assuming that subsequent answers will be “no”.

act-and-show

Answer this question “yes”, but show the results—don’t advance yet to the next question.

automatic

Answer this question and all subsequent questions in the series with “yes”, without further user interaction.

backup

Move back to the previous place that a question was asked about.

edit

Enter a recursive edit to deal with this question—instead of any other action that would normally be taken.

edit-replacement

Edit the replacement for this question in the minibuffer.

delete-and-edit

Delete the text being considered, then enter a recursive edit to replace it.

recenter
scroll-up
scroll-down
scroll-other-window
scroll-other-window-down

Perform the specified window scroll operation, then ask the same question again. Only y-or-n-p and related functions use this answer.

quit

Perform a quit right away. Only y-or-n-p and related functions use this answer.

help

Display some help, then ask again.

Variable: multi-query-replace-map

This variable holds a keymap that extends query-replace-map by providing additional keybindings that are useful in multi-buffer replacements. The additional “bindings” are:

automatic-all

Answer this question and all subsequent questions in the series with “yes”, without further user interaction, for all remaining buffers.

exit-current

Answer this question “no”, and give up on the entire series of questions for the current buffer. Continue to the next buffer in the sequence.

Variable: replace-search-function

This variable specifies a function that perform-replace calls to search for the next string to replace. Its default value is search-forward. Any other value should name a function of 3 arguments: the first 3 arguments of search-forward (see section Searching for Strings).

Variable: replace-re-search-function

This variable specifies a function that perform-replace calls to search for the next regexp to replace. Its default value is re-search-forward. Any other value should name a function of 3 arguments: the first 3 arguments of re-search-forward (see section Regular Expression Searching).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.8 Standard Regular Expressions Used in Editing

This section describes some variables that hold regular expressions used for certain purposes in editing:

User Option: page-delimiter

This is the regular expression describing line-beginnings that separate pages. The default value is "^\014" (i.e., "^^L" or "^\C-l"); this matches a line that starts with a formfeed character.

The following two regular expressions should not assume the match always starts at the beginning of a line; they should not use ‘^’ to anchor the match. Most often, the paragraph commands do check for a match only at the beginning of a line, which means that ‘^’ would be superfluous. When there is a nonzero left margin, they accept matches that start after the left margin. In that case, a ‘^’ would be incorrect. However, a ‘^’ is harmless in modes where a left margin is never used.

User Option: paragraph-separate

This is the regular expression for recognizing the beginning of a line that separates paragraphs. (If you change this, you may have to change paragraph-start also.) The default value is "[ \t\f]*$", which matches a line that consists entirely of spaces, tabs, and form feeds (after its left margin).

User Option: paragraph-start

This is the regular expression for recognizing the beginning of a line that starts or separates paragraphs. The default value is "\f\\|[ \t]*$", which matches a line containing only whitespace or starting with a form feed (after its left margin).

User Option: sentence-end

If non-nil, the value should be a regular expression describing the end of a sentence, including the whitespace following the sentence. (All paragraph boundaries also end sentences, regardless.)

If the value is nil, as it is by default, then the function sentence-end constructs the regexp. That is why you should always call the function sentence-end to obtain the regexp to be used to recognize the end of a sentence.

Function: sentence-end

This function returns the value of the variable sentence-end, if non-nil. Otherwise it returns a default value based on the values of the variables sentence-end-double-space (see Definition of sentence-end-double-space), sentence-end-without-period, and sentence-end-without-space.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34 Syntax Tables

A syntax table specifies the syntactic role of each character in a buffer. It can be used to determine where words, symbols, and other syntactic constructs begin and end. This information is used by many Emacs facilities, including Font Lock mode (see section Font Lock Mode) and the various complex movement commands (see section Motion).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.1 Syntax Table Concepts

A syntax table is a data structure which can be used to look up the syntax class and other syntactic properties of each character. Syntax tables are used by Lisp programs for scanning and moving across text.

Internally, a syntax table is a char-table (see section Char-Tables). The element at index c describes the character with code c; its value is a cons cell which specifies the syntax of the character in question. See section Syntax Table Internals, for details. However, instead of using aset and aref to modify and inspect syntax table contents, you should usually use the higher-level functions char-syntax and modify-syntax-entry, which are described in Syntax Table Functions.

Function: syntax-table-p object

This function returns t if object is a syntax table.

Each buffer has its own major mode, and each major mode has its own idea of the syntax class of various characters. For example, in Lisp mode, the character ‘;’ begins a comment, but in C mode, it terminates a statement. To support these variations, the syntax table is local to each buffer. Typically, each major mode has its own syntax table, which it installs in all buffers that use that mode. For example, the variable emacs-lisp-mode-syntax-table holds the syntax table used by Emacs Lisp mode, and c-mode-syntax-table holds the syntax table used by C mode. Changing a major mode’s syntax table alters the syntax in all of that mode’s buffers, as well as in any buffers subsequently put in that mode. Occasionally, several similar modes share one syntax table. See section Major Mode Examples, for an example of how to set up a syntax table.

A syntax table can inherit from another syntax table, which is called its parent syntax table. A syntax table can leave the syntax class of some characters unspecified, by giving them the “inherit” syntax class; such a character then acquires the syntax class specified by the parent syntax table (see section Table of Syntax Classes). Emacs defines a standard syntax table, which is the default parent syntax table, and is also the syntax table used by Fundamental mode.

Function: standard-syntax-table

This function returns the standard syntax table, which is the syntax table used in Fundamental mode.

Syntax tables are not used by the Emacs Lisp reader, which has its own built-in syntactic rules which cannot be changed. (Some Lisp systems provide ways to redefine the read syntax, but we decided to leave this feature out of Emacs Lisp for simplicity.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.2 Syntax Descriptors

The syntax class of a character describes its syntactic role. Each syntax table specifies the syntax class of each character. There is no necessary relationship between the class of a character in one syntax table and its class in any other table.

Each syntax class is designated by a mnemonic character, which serves as the name of the class when you need to specify a class. Usually, this designator character is one that is often assigned that class; however, its meaning as a designator is unvarying and independent of what syntax that character currently has. Thus, ‘\’ as a designator character always means “escape character” syntax, regardless of whether the ‘\’ character actually has that syntax in the current syntax table. See section Table of Syntax Classes, for a list of syntax classes and their designator characters.

A syntax descriptor is a Lisp string that describes the syntax class and other syntactic properties of a character. When you want to modify the syntax of a character, that is done by calling the function modify-syntax-entry and passing a syntax descriptor as one of its arguments (see section Syntax Table Functions).

The first character in a syntax descriptor must be a syntax class designator character. The second character, if present, specifies a matching character (e.g., in Lisp, the matching character for ‘(’ is ‘)’); a space specifies that there is no matching character. Then come characters specifying additional syntax properties (see section Syntax Flags).

If no matching character or flags are needed, only one character (specifying the syntax class) is sufficient.

For example, the syntax descriptor for the character ‘*’ in C mode is ". 23" (i.e., punctuation, matching character slot unused, second character of a comment-starter, first character of a comment-ender), and the entry for ‘/’ is ‘. 14’ (i.e., punctuation, matching character slot unused, first character of a comment-starter, second character of a comment-ender).

Emacs also defines raw syntax descriptors, which are used to describe syntax classes at a lower level. See section Syntax Table Internals.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.2.1 Table of Syntax Classes

Here is a table of syntax classes, the characters that designate them, their meanings, and examples of their use.

Whitespace characters: ‘ ’ or ‘-

Characters that separate symbols and words from each other. Typically, whitespace characters have no other syntactic significance, and multiple whitespace characters are syntactically equivalent to a single one. Space, tab, and formfeed are classified as whitespace in almost all major modes.

This syntax class can be designated by either ‘  or ‘-’. Both designators are equivalent.

Word constituents: ‘w

Parts of words in human languages. These are typically used in variable and command names in programs. All upper- and lower-case letters, and the digits, are typically word constituents.

Symbol constituents: ‘_

Extra characters used in variable and command names along with word constituents. Examples include the characters ‘$&*+-_<>’ in Lisp mode, which may be part of a symbol name even though they are not part of English words. In standard C, the only non-word-constituent character that is valid in symbols is underscore (‘_’).

Punctuation characters: ‘.

Characters used as punctuation in a human language, or used in a programming language to separate symbols from one another. Some programming language modes, such as Emacs Lisp mode, have no characters in this class since the few characters that are not symbol or word constituents all have other uses. Other programming language modes, such as C mode, use punctuation syntax for operators.

Open parenthesis characters: ‘(
Close parenthesis characters: ‘)

Characters used in dissimilar pairs to surround sentences or expressions. Such a grouping is begun with an open parenthesis character and terminated with a close. Each open parenthesis character matches a particular close parenthesis character, and vice versa. Normally, Emacs indicates momentarily the matching open parenthesis when you insert a close parenthesis. See section Blinking Parentheses.

In human languages, and in C code, the parenthesis pairs are ‘()’, ‘[]’, and ‘{}’. In Emacs Lisp, the delimiters for lists and vectors (‘()’ and ‘[]’) are classified as parenthesis characters.

String quotes: ‘"

Characters used to delimit string constants. The same string quote character appears at the beginning and the end of a string. Such quoted strings do not nest.

The parsing facilities of Emacs consider a string as a single token. The usual syntactic meanings of the characters in the string are suppressed.

The Lisp modes have two string quote characters: double-quote (‘"’) and vertical bar (‘|’). ‘|’ is not used in Emacs Lisp, but it is used in Common Lisp. C also has two string quote characters: double-quote for strings, and single-quote (‘'’) for character constants.

Human text has no string quote characters. We do not want quotation marks to turn off the usual syntactic properties of other characters in the quotation.

Escape-syntax characters: ‘\

Characters that start an escape sequence, such as is used in string and character constants. The character ‘\’ belongs to this class in both C and Lisp. (In C, it is used thus only inside strings, but it turns out to cause no trouble to treat it this way throughout C code.)

Characters in this class count as part of words if words-include-escapes is non-nil. See section Motion by Words.

Character quotes: ‘/

Characters used to quote the following character so that it loses its normal syntactic meaning. This differs from an escape character in that only the character immediately following is ever affected.

Characters in this class count as part of words if words-include-escapes is non-nil. See section Motion by Words.

This class is used for backslash in TeX mode.

Paired delimiters: ‘$

Similar to string quote characters, except that the syntactic properties of the characters between the delimiters are not suppressed. Only TeX mode uses a paired delimiter presently—the ‘$’ that both enters and leaves math mode.

Expression prefixes: ‘'

Characters used for syntactic operators that are considered as part of an expression if they appear next to one. In Lisp modes, these characters include the apostrophe, ‘'’ (used for quoting), the comma, ‘,’ (used in macros), and ‘#’ (used in the read syntax for certain data types).

Comment starters: ‘<
Comment enders: ‘>

Characters used in various languages to delimit comments. Human text has no comment characters. In Lisp, the semicolon (‘;’) starts a comment and a newline or formfeed ends one.

Inherit standard syntax: ‘@

This syntax class does not specify a particular syntax. It says to look in the standard syntax table to find the syntax of this character.

Generic comment delimiters: ‘!

Characters that start or end a special kind of comment. Any generic comment delimiter matches any generic comment delimiter, but they cannot match a comment starter or comment ender; generic comment delimiters can only match each other.

This syntax class is primarily meant for use with the syntax-table text property (see section Syntax Properties). You can mark any range of characters as forming a comment, by giving the first and last characters of the range syntax-table properties identifying them as generic comment delimiters.

Generic string delimiters: ‘|

Characters that start or end a string. This class differs from the string quote class in that any generic string delimiter can match any other generic string delimiter; but they do not match ordinary string quote characters.

This syntax class is primarily meant for use with the syntax-table text property (see section Syntax Properties). You can mark any range of characters as forming a string constant, by giving the first and last characters of the range syntax-table properties identifying them as generic string delimiters.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.2.2 Syntax Flags

In addition to the classes, entries for characters in a syntax table can specify flags. There are eight possible flags, represented by the characters ‘1’, ‘2’, ‘3’, ‘4’, ‘b’, ‘c’, ‘n’, and ‘p’.

All the flags except ‘p’ are used to describe comment delimiters. The digit flags are used for comment delimiters made up of 2 characters. They indicate that a character can also be part of a comment sequence, in addition to the syntactic properties associated with its character class. The flags are independent of the class and each other for the sake of characters such as ‘*’ in C mode, which is a punctuation character, and the second character of a start-of-comment sequence (‘/*’), and the first character of an end-of-comment sequence (‘*/’). The flags ‘b’, ‘c’, and ‘n’ are used to qualify the corresponding comment delimiter.

Here is a table of the possible flags for a character c, and what they mean:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.3 Syntax Table Functions

In this section we describe functions for creating, accessing and altering syntax tables.

Function: make-syntax-table &optional table

This function creates a new syntax table. If table is non-nil, the parent of the new syntax table is table; otherwise, the parent is the standard syntax table.

In the new syntax table, all characters are initially given the “inherit” (‘@’) syntax class, i.e., their syntax is inherited from the parent table (see section Table of Syntax Classes).

Function: copy-syntax-table &optional table

This function constructs a copy of table and returns it. If table is omitted or nil, it returns a copy of the standard syntax table. Otherwise, an error is signaled if table is not a syntax table.

Command: modify-syntax-entry char syntax-descriptor &optional table

This function sets the syntax entry for char according to syntax-descriptor. char must be a character, or a cons cell of the form (min . max); in the latter case, the function sets the syntax entries for all characters in the range between min and max, inclusive.

The syntax is changed only for table, which defaults to the current buffer’s syntax table, and not in any other syntax table.

The argument syntax-descriptor is a syntax descriptor, i.e., a string whose first character is a syntax class designator and whose second and subsequent characters optionally specify a matching character and syntax flags. See section Syntax Descriptors. An error is signaled if syntax-descriptor is not a valid syntax descriptor.

This function always returns nil. The old syntax information in the table for this character is discarded.

Examples:
;; Put the space character in class whitespace.
(modify-syntax-entry ?\s " ")
     ⇒ nil
;; Make ‘$’ an open parenthesis character,
;;   with ‘^’ as its matching close.
(modify-syntax-entry ?$ "(^")
     ⇒ nil
;; Make ‘^’ a close parenthesis character,
;;   with ‘$’ as its matching open.
(modify-syntax-entry ?^ ")$")
     ⇒ nil
;; Make ‘/’ a punctuation character,
;;   the first character of a start-comment sequence,
;;   and the second character of an end-comment sequence.
;;   This is used in C mode.
(modify-syntax-entry ?/ ". 14")
     ⇒ nil
Function: char-syntax character

This function returns the syntax class of character, represented by its designator character (see section Table of Syntax Classes). This returns only the class, not its matching character or syntax flags.

The following examples apply to C mode. (We use string to make it easier to see the character returned by char-syntax.)

;; Space characters have whitespace syntax class.
(string (char-syntax ?\s))
     ⇒ " "
;; Forward slash characters have punctuation syntax.
;; Note that this char-syntax call does not reveal
;; that it is also part of comment-start and -end sequences.
(string (char-syntax ?/))
     ⇒ "."
;; Open parenthesis characters have open parenthesis syntax.
;; Note that this char-syntax call does not reveal that
;; it has a matching character, ‘)’.
(string (char-syntax ?\())
     ⇒ "("
Function: set-syntax-table table

This function makes table the syntax table for the current buffer. It returns table.

Function: syntax-table

This function returns the current syntax table, which is the table for the current buffer.

Command: describe-syntax &optional buffer

This command displays the contents of the syntax table of buffer (by default, the current buffer) in a help buffer.

Macro: with-syntax-table table body…

This macro executes body using table as the current syntax table. It returns the value of the last form in body, after restoring the old current syntax table.

Since each buffer has its own current syntax table, we should make that more precise: with-syntax-table temporarily alters the current syntax table of whichever buffer is current at the time the macro execution starts. Other buffers are not affected.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.4 Syntax Properties

When the syntax table is not flexible enough to specify the syntax of a language, you can override the syntax table for specific character occurrences in the buffer, by applying a syntax-table text property. See section Text Properties, for how to apply text properties.

The valid values of syntax-table text property are:

syntax-table

If the property value is a syntax table, that table is used instead of the current buffer’s syntax table to determine the syntax for the underlying text character.

(syntax-code . matching-char)

A cons cell of this format is a raw syntax descriptor (see section Syntax Table Internals), which directly specifies a syntax class for the underlying text character.

nil

If the property is nil, the character’s syntax is determined from the current syntax table in the usual way.

Variable: parse-sexp-lookup-properties

If this is non-nil, the syntax scanning functions, like forward-sexp, pay attention to syntax text properties. Otherwise they use only the current syntax table.

Variable: syntax-propertize-function

This variable, if non-nil, should store a function for applying syntax-table properties to a specified stretch of text. It is intended to be used by major modes to install a function which applies syntax-table properties in some mode-appropriate way.

The function is called by syntax-ppss (see section Finding the Parse State for a Position), and by Font Lock mode during syntactic fontification (see section Syntactic Font Lock). It is called with two arguments, start and end, which are the starting and ending positions of the text on which it should act. It is allowed to call syntax-ppss on any position before end. However, it should not call syntax-ppss-flush-cache; so, it is not allowed to call syntax-ppss on some position and later modify the buffer at an earlier position.

Variable: syntax-propertize-extend-region-functions

This abnormal hook is run by the syntax parsing code prior to calling syntax-propertize-function. Its role is to help locate safe starting and ending buffer positions for passing to syntax-propertize-function. For example, a major mode can add a function to this hook to identify multi-line syntactic constructs, and ensure that the boundaries do not fall in the middle of one.

Each function in this hook should accept two arguments, start and end. It should return either a cons cell of two adjusted buffer positions, (new-start . new-end), or nil if no adjustment is necessary. The hook functions are run in turn, repeatedly, until they all return nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.5 Motion and Syntax

This section describes functions for moving across characters that have certain syntax classes.

Function: skip-syntax-forward syntaxes &optional limit

This function moves point forward across characters having syntax classes mentioned in syntaxes (a string of syntax class characters). It stops when it encounters the end of the buffer, or position limit (if specified), or a character it is not supposed to skip.

If syntaxes starts with ‘^’, then the function skips characters whose syntax is not in syntaxes.

The return value is the distance traveled, which is a nonnegative integer.

Function: skip-syntax-backward syntaxes &optional limit

This function moves point backward across characters whose syntax classes are mentioned in syntaxes. It stops when it encounters the beginning of the buffer, or position limit (if specified), or a character it is not supposed to skip.

If syntaxes starts with ‘^’, then the function skips characters whose syntax is not in syntaxes.

The return value indicates the distance traveled. It is an integer that is zero or less.

Function: backward-prefix-chars

This function moves point backward over any number of characters with expression prefix syntax. This includes both characters in the expression prefix syntax class, and characters with the ‘p’ flag.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6 Parsing Expressions

This section describes functions for parsing and scanning balanced expressions. We will refer to such expressions as sexps, following the terminology of Lisp, even though these functions can act on languages other than Lisp. Basically, a sexp is either a balanced parenthetical grouping, a string, or a “symbol” (i.e., a sequence of characters whose syntax is either word constituent or symbol constituent). However, characters in the expression prefix syntax class (see section Table of Syntax Classes) are treated as part of the sexp if they appear next to it.

The syntax table controls the interpretation of characters, so these functions can be used for Lisp expressions when in Lisp mode and for C expressions when in C mode. See section Moving over Balanced Expressions, for convenient higher-level functions for moving over balanced expressions.

A character’s syntax controls how it changes the state of the parser, rather than describing the state itself. For example, a string delimiter character toggles the parser state between “in-string” and “in-code”, but the syntax of characters does not directly say whether they are inside a string. For example (note that 15 is the syntax code for generic string delimiters),

(put-text-property 1 9 'syntax-table '(15 . nil))

does not tell Emacs that the first eight chars of the current buffer are a string, but rather that they are all string delimiters. As a result, Emacs treats them as four consecutive empty string constants.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.1 Motion Commands Based on Parsing

This section describes simple point-motion functions that operate based on parsing expressions.

Function: scan-lists from count depth

This function scans forward count balanced parenthetical groupings from position from. It returns the position where the scan stops. If count is negative, the scan moves backwards.

If depth is nonzero, treat the starting position as being depth parentheses deep. The scanner moves forward or backward through the buffer until the depth changes to zero count times. Hence, a positive value for depth has the effect of moving out depth levels of parenthesis from the starting position, while a negative depth has the effect of moving deeper by -depth levels of parenthesis.

Scanning ignores comments if parse-sexp-ignore-comments is non-nil.

If the scan reaches the beginning or end of the accessible part of the buffer before it has scanned over count parenthetical groupings, the return value is nil if the depth at that point is zero; if the depth is non-zero, a scan-error error is signaled.

Function: scan-sexps from count

This function scans forward count sexps from position from. It returns the position where the scan stops. If count is negative, the scan moves backwards.

Scanning ignores comments if parse-sexp-ignore-comments is non-nil.

If the scan reaches the beginning or end of (the accessible part of) the buffer while in the middle of a parenthetical grouping, an error is signaled. If it reaches the beginning or end between groupings but before count is used up, nil is returned.

Function: forward-comment count

This function moves point forward across count complete comments (that is, including the starting delimiter and the terminating delimiter if any), plus any whitespace encountered on the way. It moves backward if count is negative. If it encounters anything other than a comment or whitespace, it stops, leaving point at the place where it stopped. This includes (for instance) finding the end of a comment when moving forward and expecting the beginning of one. The function also stops immediately after moving over the specified number of complete comments. If count comments are found as expected, with nothing except whitespace between them, it returns t; otherwise it returns nil.

This function cannot tell whether the “comments” it traverses are embedded within a string. If they look like comments, it treats them as comments.

To move forward over all comments and whitespace following point, use (forward-comment (buffer-size)). (buffer-size) is a good argument to use, because the number of comments in the buffer cannot exceed that many.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.2 Finding the Parse State for a Position

For syntactic analysis, such as in indentation, often the useful thing is to compute the syntactic state corresponding to a given buffer position. This function does that conveniently.

Function: syntax-ppss &optional pos

This function returns the parser state that the parser would reach at position pos starting from the beginning of the buffer. See section Parser State, for a description of the parser state.

The return value is the same as if you call the low-level parsing function parse-partial-sexp to parse from the beginning of the buffer to pos (see section Low-Level Parsing). However, syntax-ppss uses a cache to speed up the computation. Due to this optimization, the second value (previous complete subexpression) and sixth value (minimum parenthesis depth) in the returned parser state are not meaningful.

This function has a side effect: it adds a buffer-local entry to before-change-functions (see section Change Hooks) for syntax-ppss-flush-cache (see below). This entry keeps the cache consistent as the buffer is modified. However, the cache might not be updated if syntax-ppss is called while before-change-functions is temporarily let-bound, or if the buffer is modified without running the hook, such as when using inhibit-modification-hooks. In those cases, it is necessary to call syntax-ppss-flush-cache explicitly.

Function: syntax-ppss-flush-cache beg &rest ignored-args

This function flushes the cache used by syntax-ppss, starting at position beg. The remaining arguments, ignored-args, are ignored; this function accepts them so that it can be directly used on hooks such as before-change-functions (see section Change Hooks).

Major modes can make syntax-ppss run faster by specifying where it needs to start parsing.

Variable: syntax-begin-function

If this is non-nil, it should be a function that moves to an earlier buffer position where the parser state is equivalent to nil—in other words, a position outside of any comment, string, or parenthesis. syntax-ppss uses it to further optimize its computations, when the cache gives no help.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.3 Parser State

A parser state is a list of ten elements describing the state of the syntactic parser, after it parses the text between a specified starting point and a specified end point in the buffer. Parsing functions such as syntax-ppss (see section Finding the Parse State for a Position) return a parser state as the value. Some parsing functions accept a parser state as an argument, for resuming parsing.

Here are the meanings of the elements of the parser state:

  1. The depth in parentheses, counting from 0. Warning: this can be negative if there are more close parens than open parens between the parser’s starting point and end point.
  2. The character position of the start of the innermost parenthetical grouping containing the stopping point; nil if none.
  3. The character position of the start of the last complete subexpression terminated; nil if none.
  4. Non-nil if inside a string. More precisely, this is the character that will terminate the string, or t if a generic string delimiter character should terminate it.
  5. t if inside a non-nestable comment (of any comment style; see section Syntax Flags); or the comment nesting level if inside a comment that can be nested.
  6. t if the end point is just after a quote character.
  7. The minimum parenthesis depth encountered during this scan.
  8. What kind of comment is active: nil if not in a comment or in a comment of style ‘a’; 1 for a comment of style ‘b’; 2 for a comment of style ‘c’; and syntax-table for a comment that should be ended by a generic comment delimiter character.
  9. The string or comment start position. While inside a comment, this is the position where the comment began; while inside a string, this is the position where the string began. When outside of strings and comments, this element is nil.
  10. Internal data for continuing the parsing. The meaning of this data is subject to change; it is used if you pass this list as the state argument to another call.

Elements 1, 2, and 6 are ignored in a state which you pass as an argument to continue parsing, and elements 8 and 9 are used only in trivial cases. Those elements are mainly used internally by the parser code.

One additional piece of useful information is available from a parser state using this function:

Function: syntax-ppss-toplevel-pos state

This function extracts, from parser state state, the last position scanned in the parse which was at top level in grammatical structure. “At top level” means outside of any parentheses, comments, or strings.

The value is nil if state represents a parse which has arrived at a top level position.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.4 Low-Level Parsing

The most basic way to use the expression parser is to tell it to start at a given position with a certain state, and parse up to a specified end position.

Function: parse-partial-sexp start limit &optional target-depth stop-before state stop-comment

This function parses a sexp in the current buffer starting at start, not scanning past limit. It stops at position limit or when certain criteria described below are met, and sets point to the location where parsing stops. It returns a parser state describing the status of the parse at the point where it stops.

If the third argument target-depth is non-nil, parsing stops if the depth in parentheses becomes equal to target-depth. The depth starts at 0, or at whatever is given in state.

If the fourth argument stop-before is non-nil, parsing stops when it comes to any character that starts a sexp. If stop-comment is non-nil, parsing stops when it comes to the start of a comment. If stop-comment is the symbol syntax-table, parsing stops after the start of a comment or a string, or the end of a comment or a string, whichever comes first.

If state is nil, start is assumed to be at the top level of parenthesis structure, such as the beginning of a function definition. Alternatively, you might wish to resume parsing in the middle of the structure. To do this, you must provide a state argument that describes the initial status of parsing. The value returned by a previous call to parse-partial-sexp will do nicely.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.5 Parameters to Control Parsing

Variable: multibyte-syntax-as-symbol

If this variable is non-nil, scan-sexps treats all non-ASCII characters as symbol constituents regardless of what the syntax table says about them. (However, text properties can still override the syntax.)

User Option: parse-sexp-ignore-comments

If the value is non-nil, then comments are treated as whitespace by the functions in this section and by forward-sexp, scan-lists and scan-sexps.

The behavior of parse-partial-sexp is also affected by parse-sexp-lookup-properties (see section Syntax Properties).

You can use forward-comment to move forward or backward over one comment or several comments.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.7 Syntax Table Internals

Syntax tables are implemented as char-tables (see section Char-Tables), but most Lisp programs don’t work directly with their elements. Syntax tables do not store syntax data as syntax descriptors (see section Syntax Descriptors); they use an internal format, which is documented in this section. This internal format can also be assigned as syntax properties (see section Syntax Properties).

Each entry in a syntax table is a raw syntax descriptor: a cons cell of the form (syntax-code . matching-char). syntax-code is an integer which encodes the syntax class and syntax flags, according to the table below. matching-char, if non-nil, specifies a matching character (similar to the second character in a syntax descriptor).

Here are the syntax codes corresponding to the various syntax classes:

CodeClassCodeClass
0whitespace8paired delimiter
1punctuation9escape
2word10character quote
3symbol11comment-start
4open parenthesis12comment-end
5close parenthesis13inherit
6expression prefix14generic comment
7string quote15generic string

For example, in the standard syntax table, the entry for ‘(’ is (4 . 41). 41 is the character code for ‘)’.

Syntax flags are encoded in higher order bits, starting 16 bits from the least significant bit. This table gives the power of two which corresponds to each syntax flag.

PrefixFlagPrefixFlag
1(lsh 1 16)p(lsh 1 20)
2(lsh 1 17)b(lsh 1 21)
3(lsh 1 18)n(lsh 1 22)
4(lsh 1 19)
Function: string-to-syntax desc

Given a syntax descriptor desc (a string), this function returns the corresponding raw syntax descriptor.

Function: syntax-after pos

This function returns the raw syntax descriptor for the character in the buffer after position pos, taking account of syntax properties as well as the syntax table. If pos is outside the buffer’s accessible portion (see section accessible portion), the return value is nil.

Function: syntax-class syntax

This function returns the syntax code for the raw syntax descriptor syntax. More precisely, it takes the raw syntax descriptor’s syntax-code component, masks off the high 16 bits which record the syntax flags, and returns the resulting integer.

If syntax is nil, the return value is returns nil. This is so that the expression

(syntax-class (syntax-after pos))

evaluates to nil if pos is outside the buffer’s accessible portion, without throwing errors or returning an incorrect code.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.8 Categories

Categories provide an alternate way of classifying characters syntactically. You can define several categories as needed, then independently assign each character to one or more categories. Unlike syntax classes, categories are not mutually exclusive; it is normal for one character to belong to several categories.

Each buffer has a category table which records which categories are defined and also which characters belong to each category. Each category table defines its own categories, but normally these are initialized by copying from the standard categories table, so that the standard categories are available in all modes.

Each category has a name, which is an ASCII printing character in the range ‘  to ‘~’. You specify the name of a category when you define it with define-category.

The category table is actually a char-table (see section Char-Tables). The element of the category table at index c is a category set—a bool-vector—that indicates which categories character c belongs to. In this category set, if the element at index cat is t, that means category cat is a member of the set, and that character c belongs to category cat.

For the next three functions, the optional argument table defaults to the current buffer’s category table.

Function: define-category char docstring &optional table

This function defines a new category, with name char and documentation docstring, for the category table table.

Here’s an example of defining a new category for characters that have strong right-to-left directionality (see section Bidirectional Display) and using it in a special category table:

(defvar special-category-table-for-bidi
  (let ((category-table (make-category-table))
	(uniprop-table (unicode-property-table-internal 'bidi-class)))
    (define-category ?R "Characters of bidi-class R, AL, or RLO"
                     category-table)
    (map-char-table
     #'(lambda (key val)
	 (if (memq val '(R AL RLO))
	     (modify-category-entry key ?R category-table)))
     uniprop-table)
    category-table))
Function: category-docstring category &optional table

This function returns the documentation string of category category in category table table.

(category-docstring ?a)
     ⇒ "ASCII"
(category-docstring ?l)
     ⇒ "Latin"
Function: get-unused-category &optional table

This function returns a category name (a character) which is not currently defined in table. If all possible categories are in use in table, it returns nil.

Function: category-table

This function returns the current buffer’s category table.

Function: category-table-p object

This function returns t if object is a category table, otherwise nil.

Function: standard-category-table

This function returns the standard category table.

Function: copy-category-table &optional table

This function constructs a copy of table and returns it. If table is not supplied (or is nil), it returns a copy of the standard category table. Otherwise, an error is signaled if table is not a category table.

Function: set-category-table table

This function makes table the category table for the current buffer. It returns table.

Function: make-category-table

This creates and returns an empty category table. In an empty category table, no categories have been allocated, and no characters belong to any categories.

Function: make-category-set categories

This function returns a new category set—a bool-vector—whose initial contents are the categories listed in the string categories. The elements of categories should be category names; the new category set has t for each of those categories, and nil for all other categories.

(make-category-set "al")
     ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
Function: char-category-set char

This function returns the category set for character char in the current buffer’s category table. This is the bool-vector which records which categories the character char belongs to. The function char-category-set does not allocate storage, because it returns the same bool-vector that exists in the category table.

(char-category-set ?a)
     ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
Function: category-set-mnemonics category-set

This function converts the category set category-set into a string containing the characters that designate the categories that are members of the set.

(category-set-mnemonics (char-category-set ?a))
     ⇒ "al"
Function: modify-category-entry char category &optional table reset

This function modifies the category set of char in category table table (which defaults to the current buffer’s category table). char can be a character, or a cons cell of the form (min . max); in the latter case, the function modifies the category sets of all characters in the range between min and max, inclusive.

Normally, it modifies a category set by adding category to it. But if reset is non-nil, then it deletes category instead.

Command: describe-categories &optional buffer-or-name

This function describes the category specifications in the current category table. It inserts the descriptions in a buffer, and then displays that buffer. If buffer-or-name is non-nil, it describes the category table of that buffer instead.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35 Abbrevs and Abbrev Expansion

An abbreviation or abbrev is a string of characters that may be expanded to a longer string. The user can insert the abbrev string and find it replaced automatically with the expansion of the abbrev. This saves typing.

The set of abbrevs currently in effect is recorded in an abbrev table. Each buffer has a local abbrev table, but normally all buffers in the same major mode share one abbrev table. There is also a global abbrev table. Normally both are used.

An abbrev table is represented as an obarray. See section Creating and Interning Symbols, for information about obarrays. Each abbreviation is represented by a symbol in the obarray. The symbol’s name is the abbreviation; its value is the expansion; its function definition is the hook function for performing the expansion (see section Defining Abbrevs); and its property list cell contains various additional properties, including the use count and the number of times the abbreviation has been expanded (see section Abbrev Properties).

Certain abbrevs, called system abbrevs, are defined by a major mode instead of the user. A system abbrev is identified by its non-nil :system property (see section Abbrev Properties). When abbrevs are saved to an abbrev file, system abbrevs are omitted. See section Saving Abbrevs in Files.

Because the symbols used for abbrevs are not interned in the usual obarray, they will never appear as the result of reading a Lisp expression; in fact, normally they are never used except by the code that handles abbrevs. Therefore, it is safe to use them in a nonstandard way.

If the minor mode Abbrev mode is enabled, the buffer-local variable abbrev-mode is non-nil, and abbrevs are automatically expanded in the buffer. For the user-level commands for abbrevs, see Abbrev Mode in The GNU Emacs Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.1 Abbrev Tables

This section describes how to create and manipulate abbrev tables.

Function: make-abbrev-table &optional props

This function creates and returns a new, empty abbrev table—an obarray containing no symbols. It is a vector filled with zeros. props is a property list that is applied to the new table (see section Abbrev Table Properties).

Function: abbrev-table-p object

This function returns a non-nil value if object is an abbrev table.

Function: clear-abbrev-table abbrev-table

This function undefines all the abbrevs in abbrev-table, leaving it empty.

Function: copy-abbrev-table abbrev-table

This function returns a copy of abbrev-table—a new abbrev table containing the same abbrev definitions. It does not copy any property lists; only the names, values, and functions.

Function: define-abbrev-table tabname definitions &optional docstring &rest props

This function defines tabname (a symbol) as an abbrev table name, i.e., as a variable whose value is an abbrev table. It defines abbrevs in the table according to definitions, a list of elements of the form (abbrevname expansion [hook] [props...]). These elements are passed as arguments to define-abbrev.

The optional string docstring is the documentation string of the variable tabname. The property list props is applied to the abbrev table (see section Abbrev Table Properties).

If this function is called more than once for the same tabname, subsequent calls add the definitions in definitions to tabname, rather than overwriting the entire original contents. (A subsequent call only overrides abbrevs explicitly redefined or undefined in definitions.)

Variable: abbrev-table-name-list

This is a list of symbols whose values are abbrev tables. define-abbrev-table adds the new abbrev table name to this list.

Function: insert-abbrev-table-description name &optional human

This function inserts before point a description of the abbrev table named name. The argument name is a symbol whose value is an abbrev table.

If human is non-nil, the description is human-oriented. System abbrevs are listed and identified as such. Otherwise the description is a Lisp expression—a call to define-abbrev-table that would define name as it is currently defined, but without the system abbrevs. (The mode or package using name is supposed to add these to name separately.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.2 Defining Abbrevs

define-abbrev is the low-level basic function for defining an abbrev in an abbrev table.

When a major mode defines a system abbrev, it should call define-abbrev and specify t for the :system property. Be aware that any saved non-“system” abbrevs are restored at startup, i.e., before some major modes are loaded. Therefore, major modes should not assume that their abbrev tables are empty when they are first loaded.

Function: define-abbrev abbrev-table name expansion &optional hook &rest props

This function defines an abbrev named name, in abbrev-table, to expand to expansion and call hook, with properties props (see section Abbrev Properties). The return value is name. The :system property in props is treated specially here: if it has the value force, then it will overwrite an existing definition even for a non-“system” abbrev of the same name.

name should be a string. The argument expansion is normally the desired expansion (a string), or nil to undefine the abbrev. If it is anything but a string or nil, then the abbreviation “expands” solely by running hook.

The argument hook is a function or nil. If hook is non-nil, then it is called with no arguments after the abbrev is replaced with expansion; point is located at the end of expansion when hook is called.

If hook is a non-nil symbol whose no-self-insert property is non-nil, hook can explicitly control whether to insert the self-inserting input character that triggered the expansion. If hook returns non-nil in this case, that inhibits insertion of the character. By contrast, if hook returns nil, expand-abbrev (or abbrev-insert) also returns nil, as if expansion had not really occurred.

Normally, define-abbrev sets the variable abbrevs-changed to t, if it actually changes the abbrev. This is so that some commands will offer to save the abbrevs. It does not do this for a system abbrev, since those aren’t saved anyway.

User Option: only-global-abbrevs

If this variable is non-nil, it means that the user plans to use global abbrevs only. This tells the commands that define mode-specific abbrevs to define global ones instead. This variable does not alter the behavior of the functions in this section; it is examined by their callers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.3 Saving Abbrevs in Files

A file of saved abbrev definitions is actually a file of Lisp code. The abbrevs are saved in the form of a Lisp program to define the same abbrev tables with the same contents. Therefore, you can load the file with load (see section How Programs Do Loading). However, the function quietly-read-abbrev-file is provided as a more convenient interface. Emacs automatically calls this function at startup.

User-level facilities such as save-some-buffers can save abbrevs in a file automatically, under the control of variables described here.

User Option: abbrev-file-name

This is the default file name for reading and saving abbrevs.

Function: quietly-read-abbrev-file &optional filename

This function reads abbrev definitions from a file named filename, previously written with write-abbrev-file. If filename is omitted or nil, the file specified in abbrev-file-name is used.

As the name implies, this function does not display any messages.

User Option: save-abbrevs

A non-nil value for save-abbrevs means that Emacs should offer to save abbrevs (if any have changed) when files are saved. If the value is silently, Emacs saves the abbrevs without asking the user. abbrev-file-name specifies the file to save the abbrevs in.

Variable: abbrevs-changed

This variable is set non-nil by defining or altering any abbrevs (except system abbrevs). This serves as a flag for various Emacs commands to offer to save your abbrevs.

Command: write-abbrev-file &optional filename

Save all abbrev definitions (except system abbrevs), for all abbrev tables listed in abbrev-table-name-list, in the file filename, in the form of a Lisp program that when loaded will define the same abbrevs. If filename is nil or omitted, abbrev-file-name is used. This function returns nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.4 Looking Up and Expanding Abbreviations

Abbrevs are usually expanded by certain interactive commands, including self-insert-command. This section describes the subroutines used in writing such commands, as well as the variables they use for communication.

Function: abbrev-symbol abbrev &optional table

This function returns the symbol representing the abbrev named abbrev. It returns nil if that abbrev is not defined. The optional second argument table is the abbrev table in which to look it up. If table is nil, this function tries first the current buffer’s local abbrev table, and second the global abbrev table.

Function: abbrev-expansion abbrev &optional table

This function returns the string that abbrev would expand into (as defined by the abbrev tables used for the current buffer). It returns nil if abbrev is not a valid abbrev. The optional argument table specifies the abbrev table to use, as in abbrev-symbol.

Command: expand-abbrev

This command expands the abbrev before point, if any. If point does not follow an abbrev, this command does nothing. To do the expansion, it calls the function that is the value of the abbrev-expand-function variable, with no arguments, and returns whatever that function does.

The default expansion function returns the abbrev symbol if it did expansion, and nil otherwise. If the abbrev symbol has a hook function that is a symbol whose no-self-insert property is non-nil, and if the hook function returns nil as its value, then the default expansion function returns nil, even though expansion did occur.

Function: abbrev-insert abbrev &optional name start end

This function inserts the abbrev expansion of abbrev, replacing the text between start and end. If start is omitted, it defaults to point. name, if non-nil, should be the name by which this abbrev was found (a string); it is used to figure out whether to adjust the capitalization of the expansion. The function returns abbrev if the abbrev was successfully inserted.

Command: abbrev-prefix-mark &optional arg

This command marks the current location of point as the beginning of an abbrev. The next call to expand-abbrev will use the text from here to point (where it is then) as the abbrev to expand, rather than using the previous word as usual.

First, this command expands any abbrev before point, unless arg is non-nil. (Interactively, arg is the prefix argument.) Then it inserts a hyphen before point, to indicate the start of the next abbrev to be expanded. The actual expansion removes the hyphen.

User Option: abbrev-all-caps

When this is set non-nil, an abbrev entered entirely in upper case is expanded using all upper case. Otherwise, an abbrev entered entirely in upper case is expanded by capitalizing each word of the expansion.

Variable: abbrev-start-location

The value of this variable is a buffer position (an integer or a marker) for expand-abbrev to use as the start of the next abbrev to be expanded. The value can also be nil, which means to use the word before point instead. abbrev-start-location is set to nil each time expand-abbrev is called. This variable is also set by abbrev-prefix-mark.

Variable: abbrev-start-location-buffer

The value of this variable is the buffer for which abbrev-start-location has been set. Trying to expand an abbrev in any other buffer clears abbrev-start-location. This variable is set by abbrev-prefix-mark.

Variable: last-abbrev

This is the abbrev-symbol of the most recent abbrev expanded. This information is left by expand-abbrev for the sake of the unexpand-abbrev command (see Expanding Abbrevs in The GNU Emacs Manual).

Variable: last-abbrev-location

This is the location of the most recent abbrev expanded. This contains information left by expand-abbrev for the sake of the unexpand-abbrev command.

Variable: last-abbrev-text

This is the exact expansion text of the most recent abbrev expanded, after case conversion (if any). Its value is nil if the abbrev has already been unexpanded. This contains information left by expand-abbrev for the sake of the unexpand-abbrev command.

Variable: abbrev-expand-function

The value of this variable is a function that expand-abbrev will call with no arguments to do the expansion. The function can do anything it wants before and after performing the expansion. It should return the abbrev symbol if expansion took place.

The following sample code shows a simple use of abbrev-expand-function. It assumes that foo-mode is a mode for editing certain files in which lines that start with ‘#’ are comments. You want to use Text mode abbrevs for those lines. The regular local abbrev table, foo-mode-abbrev-table is appropriate for all other lines. See section Standard Abbrev Tables, for the definitions of local-abbrev-table and text-mode-abbrev-table. See section Advising Emacs Lisp Functions, for details of add-function.

(defun foo-mode-abbrev-expand-function (expand)
  (if (not (save-excursion (forward-line 0) (eq (char-after) ?#)))
      ;; Performs normal expansion.
      (funcall expand)
    ;; We're inside a comment: use the text-mode abbrevs.
    (let ((local-abbrev-table text-mode-abbrev-table))
      (funcall expand))))

(add-hook 'foo-mode-hook
          #'(lambda ()
              (add-function :around (local 'abbrev-expand-function)
                            #'foo-mode-abbrev-expand-function)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.5 Standard Abbrev Tables

Here we list the variables that hold the abbrev tables for the preloaded major modes of Emacs.

Variable: global-abbrev-table

This is the abbrev table for mode-independent abbrevs. The abbrevs defined in it apply to all buffers. Each buffer may also have a local abbrev table, whose abbrev definitions take precedence over those in the global table.

Variable: local-abbrev-table

The value of this buffer-local variable is the (mode-specific) abbreviation table of the current buffer. It can also be a list of such tables.

Variable: abbrev-minor-mode-table-alist

The value of this variable is a list of elements of the form (mode . abbrev-table) where mode is the name of a variable: if the variable is bound to a non-nil value, then the abbrev-table is active, otherwise it is ignored. abbrev-table can also be a list of abbrev tables.

Variable: fundamental-mode-abbrev-table

This is the local abbrev table used in Fundamental mode; in other words, it is the local abbrev table in all buffers in Fundamental mode.

Variable: text-mode-abbrev-table

This is the local abbrev table used in Text mode.

Variable: lisp-mode-abbrev-table

This is the local abbrev table used in Lisp mode. It is the parent of the local abbrev table used in Emacs Lisp mode. See section Abbrev Table Properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.6 Abbrev Properties

Abbrevs have properties, some of which influence the way they work. You can provide them as arguments to define-abbrev, and manipulate them with the following functions:

Function: abbrev-put abbrev prop val

Set the property prop of abbrev to value val.

Function: abbrev-get abbrev prop

Return the property prop of abbrev, or nil if the abbrev has no such property.

The following properties have special meanings:

:count

This property counts the number of times the abbrev has been expanded. If not explicitly set, it is initialized to 0 by define-abbrev.

:system

If non-nil, this property marks the abbrev as a system abbrev. Such abbrevs are not saved (see section Saving Abbrevs in Files).

:enable-function

If non-nil, this property should be a function of no arguments which returns nil if the abbrev should not be used and t otherwise.

:case-fixed

If non-nil, this property indicates that the case of the abbrev’s name is significant and should only match a text with the same pattern of capitalization. It also disables the code that modifies the capitalization of the expansion.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.7 Abbrev Table Properties

Like abbrevs, abbrev tables have properties, some of which influence the way they work. You can provide them as arguments to define-abbrev-table, and manipulate them with the functions:

Function: abbrev-table-put table prop val

Set the property prop of abbrev table table to value val.

Function: abbrev-table-get table prop

Return the property prop of abbrev table table, or nil if the abbrev has no such property.

The following properties have special meaning:

:enable-function

This is like the :enable-function abbrev property except that it applies to all abbrevs in the table. It is used before even trying to find the abbrev before point, so it can dynamically modify the abbrev table.

:case-fixed

This is like the :case-fixed abbrev property except that it applies to all abbrevs in the table.

:regexp

If non-nil, this property is a regular expression that indicates how to extract the name of the abbrev before point, before looking it up in the table. When the regular expression matches before point, the abbrev name is expected to be in submatch 1. If this property is nil, the default is to use backward-word and forward-word to find the name. This property allows the use of abbrevs whose name contains characters of non-word syntax.

:parents

This property holds a list of tables from which to inherit other abbrevs.

:abbrev-table-modiff

This property holds a counter incremented each time a new abbrev is added to the table.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36 Processes

In the terminology of operating systems, a process is a space in which a program can execute. Emacs runs in a process. Emacs Lisp programs can invoke other programs in processes of their own. These are called subprocesses or child processes of the Emacs process, which is their parent process.

A subprocess of Emacs may be synchronous or asynchronous, depending on how it is created. When you create a synchronous subprocess, the Lisp program waits for the subprocess to terminate before continuing execution. When you create an asynchronous subprocess, it can run in parallel with the Lisp program. This kind of subprocess is represented within Emacs by a Lisp object which is also called a “process”. Lisp programs can use this object to communicate with the subprocess or to control it. For example, you can send signals, obtain status information, receive output from the process, or send input to it.

Function: processp object

This function returns t if object represents an Emacs subprocess, nil otherwise.

In addition to subprocesses of the current Emacs session, you can also access other processes running on your machine. See section Accessing Other Processes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.1 Functions that Create Subprocesses

There are three primitives that create a new subprocess in which to run a program. One of them, start-process, creates an asynchronous process and returns a process object (see section Creating an Asynchronous Process). The other two, call-process and call-process-region, create a synchronous process and do not return a process object (see section Creating a Synchronous Process). There are various higher-level functions that make use of these primitives to run particular types of process.

Synchronous and asynchronous processes are explained in the following sections. Since the three functions are all called in a similar fashion, their common arguments are described here.

In all cases, the function’s program argument specifies the program to be run. An error is signaled if the file is not found or cannot be executed. If the file name is relative, the variable exec-path contains a list of directories to search. Emacs initializes exec-path when it starts up, based on the value of the environment variable PATH. The standard file name constructs, ‘~’, ‘.’, and ‘..’, are interpreted as usual in exec-path, but environment variable substitutions (‘$HOME’, etc.) are not recognized; use substitute-in-file-name to perform them (see section Functions that Expand Filenames). nil in this list refers to default-directory.

Executing a program can also try adding suffixes to the specified name:

User Option: exec-suffixes

This variable is a list of suffixes (strings) to try adding to the specified program file name. The list should include "" if you want the name to be tried exactly as specified. The default value is system-dependent.

Please note: The argument program contains only the name of the program; it may not contain any command-line arguments. You must use a separate argument, args, to provide those, as described below.

Each of the subprocess-creating functions has a buffer-or-name argument that specifies where the standard output from the program will go. It should be a buffer or a buffer name; if it is a buffer name, that will create the buffer if it does not already exist. It can also be nil, which says to discard the output, unless a custom filter function handles it. (See section Process Filter Functions, and Reading and Printing Lisp Objects.) Normally, you should avoid having multiple processes send output to the same buffer because their output would be intermixed randomly. For synchronous processes, you can send the output to a file instead of a buffer.

All three of the subprocess-creating functions have a &rest argument, args. The args must all be strings, and they are supplied to program as separate command line arguments. Wildcard characters and other shell constructs have no special meanings in these strings, since the strings are passed directly to the specified program.

The subprocess inherits its environment from Emacs, but you can specify overrides for it with process-environment. See section Operating System Environment. The subprocess gets its current directory from the value of default-directory.

Variable: exec-directory

The value of this variable is a string, the name of a directory that contains programs that come with GNU Emacs and are intended for Emacs to invoke. The program movemail is an example of such a program; Rmail uses it to fetch new mail from an inbox.

User Option: exec-path

The value of this variable is a list of directories to search for programs to run in subprocesses. Each element is either the name of a directory (i.e., a string), or nil, which stands for the default directory (which is the value of default-directory).

The value of exec-path is used by call-process and start-process when the program argument is not an absolute file name.

Generally, you should not modify exec-path directly. Instead, ensure that your PATH environment variable is set appropriately before starting Emacs. Trying to modify exec-path independently of PATH can lead to confusing results.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.2 Shell Arguments

Lisp programs sometimes need to run a shell and give it a command that contains file names that were specified by the user. These programs ought to be able to support any valid file name. But the shell gives special treatment to certain characters, and if these characters occur in the file name, they will confuse the shell. To handle these characters, use the function shell-quote-argument:

Function: shell-quote-argument argument

This function returns a string that represents, in shell syntax, an argument whose actual contents are argument. It should work reliably to concatenate the return value into a shell command and then pass it to a shell for execution.

Precisely what this function does depends on your operating system. The function is designed to work with the syntax of your system’s standard shell; if you use an unusual shell, you will need to redefine this function.

;; This example shows the behavior on GNU and Unix systems.
(shell-quote-argument "foo > bar")
     ⇒ "foo\\ \\>\\ bar"

;; This example shows the behavior on MS-DOS and MS-Windows.
(shell-quote-argument "foo > bar")
     ⇒ "\"foo > bar\""

Here’s an example of using shell-quote-argument to construct a shell command:

(concat "diff -c "
        (shell-quote-argument oldfile)
        " "
        (shell-quote-argument newfile))

The following two functions are useful for combining a list of individual command-line argument strings into a single string, and taking a string apart into a list of individual command-line arguments. These functions are mainly intended for converting user input in the minibuffer, a Lisp string, into a list of string arguments to be passed to call-process or start-process, or for converting such lists of arguments into a single Lisp string to be presented in the minibuffer or echo area.

Function: split-string-and-unquote string &optional separators

This function splits string into substrings at matches for the regular expression separators, like split-string does (see section Creating Strings); in addition, it removes quoting from the substrings. It then makes a list of the substrings and returns it.

If separators is omitted or nil, it defaults to "\\s-+", which is a regular expression that matches one or more characters with whitespace syntax (see section Table of Syntax Classes).

This function supports two types of quoting: enclosing a whole string in double quotes "…", and quoting individual characters with a backslash escape ‘\’. The latter is also used in Lisp strings, so this function can handle those as well.

Function: combine-and-quote-strings list-of-strings &optional separator

This function concatenates list-of-strings into a single string, quoting each string as necessary. It also sticks the separator string between each pair of strings; if separator is omitted or nil, it defaults to " ". The return value is the resulting string.

The strings in list-of-strings that need quoting are those that include separator as their substring. Quoting a string encloses it in double quotes "…". In the simplest case, if you are consing a command from the individual command-line arguments, every argument that includes embedded blanks will be quoted.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.3 Creating a Synchronous Process

After a synchronous process is created, Emacs waits for the process to terminate before continuing. Starting Dired on GNU or Unix18 is an example of this: it runs ls in a synchronous process, then modifies the output slightly. Because the process is synchronous, the entire directory listing arrives in the buffer before Emacs tries to do anything with it.

While Emacs waits for the synchronous subprocess to terminate, the user can quit by typing C-g. The first C-g tries to kill the subprocess with a SIGINT signal; but it waits until the subprocess actually terminates before quitting. If during that time the user types another C-g, that kills the subprocess instantly with SIGKILL and quits immediately (except on MS-DOS, where killing other processes doesn’t work). See section Quitting.

The synchronous subprocess functions return an indication of how the process terminated.

The output from a synchronous subprocess is generally decoded using a coding system, much like text read from a file. The input sent to a subprocess by call-process-region is encoded using a coding system, much like text written into a file. See section Coding Systems.

Function: call-process program &optional infile destination display &rest args

This function calls program and waits for it to finish.

The current working directory of the subprocess is default-directory.

The standard input for the new process comes from file infile if infile is not nil, and from the null device otherwise. The argument destination says where to put the process output. Here are the possibilities:

a buffer

Insert the output in that buffer, before point. This includes both the standard output stream and the standard error stream of the process.

a string

Insert the output in a buffer with that name, before point.

t

Insert the output in the current buffer, before point.

nil

Discard the output.

0

Discard the output, and return nil immediately without waiting for the subprocess to finish.

In this case, the process is not truly synchronous, since it can run in parallel with Emacs; but you can think of it as synchronous in that Emacs is essentially finished with the subprocess as soon as this function returns.

MS-DOS doesn’t support asynchronous subprocesses, so this option doesn’t work there.

(:file file-name)

Send the output to the file name specified, overwriting it if it already exists.

(real-destination error-destination)

Keep the standard output stream separate from the standard error stream; deal with the ordinary output as specified by real-destination, and dispose of the error output according to error-destination. If error-destination is nil, that means to discard the error output, t means mix it with the ordinary output, and a string specifies a file name to redirect error output into.

You can’t directly specify a buffer to put the error output in; that is too difficult to implement. But you can achieve this result by sending the error output to a temporary file and then inserting the file into a buffer.

If display is non-nil, then call-process redisplays the buffer as output is inserted. (However, if the coding system chosen for decoding output is undecided, meaning deduce the encoding from the actual data, then redisplay sometimes cannot continue once non-ASCII characters are encountered. There are fundamental reasons why it is hard to fix this; see Receiving Output from Processes.)

Otherwise the function call-process does no redisplay, and the results become visible on the screen only when Emacs redisplays that buffer in the normal course of events.

The remaining arguments, args, are strings that specify command line arguments for the program.

The value returned by call-process (unless you told it not to wait) indicates the reason for process termination. A number gives the exit status of the subprocess; 0 means success, and any other value means failure. If the process terminated with a signal, call-process returns a string describing the signal.

In the examples below, the buffer ‘foo’ is current.

(call-process "pwd" nil t)
     ⇒ 0

---------- Buffer: foo ----------
/home/lewis/manual
---------- Buffer: foo ----------
(call-process "grep" nil "bar" nil "lewis" "/etc/passwd")
     ⇒ 0

---------- Buffer: bar ----------
lewis:x:1001:1001:Bil Lewis,,,,:/home/lewis:/bin/bash

---------- Buffer: bar ----------

Here is an example of the use of call-process, as used to be found in the definition of the insert-directory function:

(call-process insert-directory-program nil t nil switches
              (if full-directory-p
                  (concat (file-name-as-directory file) ".")
                file))
Function: process-file program &optional infile buffer display &rest args

This function processes files synchronously in a separate process. It is similar to call-process, but may invoke a file handler based on the value of the variable default-directory, which specifies the current working directory of the subprocess.

The arguments are handled in almost the same way as for call-process, with the following differences:

Some file handlers may not support all combinations and forms of the arguments infile, buffer, and display. For example, some file handlers might behave as if display were nil, regardless of the value actually passed. As another example, some file handlers might not support separating standard output and error output by way of the buffer argument.

If a file handler is invoked, it determines the program to run based on the first argument program. For instance, suppose that a handler for remote files is invoked. Then the path that is used for searching for the program might be different from exec-path.

The second argument infile may invoke a file handler. The file handler could be different from the handler chosen for the process-file function itself. (For example, default-directory could be on one remote host, and infile on a different remote host. Or default-directory could be non-special, whereas infile is on a remote host.)

If buffer is a list of the form (real-destination error-destination), and error-destination names a file, then the same remarks as for infile apply.

The remaining arguments (args) will be passed to the process verbatim. Emacs is not involved in processing file names that are present in args. To avoid confusion, it may be best to avoid absolute file names in args, but rather to specify all file names as relative to default-directory. The function file-relative-name is useful for constructing such relative file names.

Variable: process-file-side-effects

This variable indicates whether a call of process-file changes remote files.

By default, this variable is always set to t, meaning that a call of process-file could potentially change any file on a remote host. When set to nil, a file handler could optimize its behavior with respect to remote file attribute caching.

You should only ever change this variable with a let-binding; never with setq.

Function: call-process-region start end program &optional delete destination display &rest args

This function sends the text from start to end as standard input to a process running program. It deletes the text sent if delete is non-nil; this is useful when destination is t, to insert the output in the current buffer in place of the input.

The arguments destination and display control what to do with the output from the subprocess, and whether to update the display as it comes in. For details, see the description of call-process, above. If destination is the integer 0, call-process-region discards the output and returns nil immediately, without waiting for the subprocess to finish (this only works if asynchronous subprocesses are supported; i.e., not on MS-DOS).

The remaining arguments, args, are strings that specify command line arguments for the program.

The return value of call-process-region is just like that of call-process: nil if you told it to return without waiting; otherwise, a number or string which indicates how the subprocess terminated.

In the following example, we use call-process-region to run the cat utility, with standard input being the first five characters in buffer ‘foo’ (the word ‘input’). cat copies its standard input into its standard output. Since the argument destination is t, this output is inserted in the current buffer.

---------- Buffer: foo ----------
input∗
---------- Buffer: foo ----------
(call-process-region 1 6 "cat" nil t)
     ⇒ 0

---------- Buffer: foo ----------
inputinput∗
---------- Buffer: foo ----------

For example, the shell-command-on-region command uses call-process-region in a manner similar to this:

(call-process-region
 start end
 shell-file-name      ; name of program
 nil                  ; do not delete region
 buffer               ; send output to buffer
 nil                  ; no redisplay during output
 "-c" command)        ; arguments for the shell
Function: call-process-shell-command command &optional infile destination display

This function executes the shell command command synchronously. The arguments are handled as in call-process. An old calling convention allowed to pass any number of additional arguments after display, which were concatenated to command; this is still supported, but strongly discouraged.

Function: process-file-shell-command command &optional infile destination display

This function is like call-process-shell-command, but uses process-file internally. Depending on default-directory, command can be executed also on remote hosts. An old calling convention allowed to pass any number of additional arguments after display, which were concatenated to command; this is still supported, but strongly discouraged.

Function: shell-command-to-string command

This function executes command (a string) as a shell command, then returns the command’s output as a string.

Function: process-lines program &rest args

This function runs program, waits for it to finish, and returns its output as a list of strings. Each string in the list holds a single line of text output by the program; the end-of-line characters are stripped from each line. The arguments beyond program, args, are strings that specify command-line arguments with which to run the program.

If program exits with a non-zero exit status, this function signals an error.

This function works by calling call-process, so program output is decoded in the same way as for call-process.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.4 Creating an Asynchronous Process

In this section, we describe how to create an asynchronous process. After an asynchronous process is created, it runs in parallel with Emacs, and Emacs can communicate with it using the functions described in the following sections (see section Sending Input to Processes, and see section Receiving Output from Processes). Note that process communication is only partially asynchronous: Emacs sends data to the process only when certain functions are called, and Emacs accepts data from the process only while waiting for input or for a time delay.

An asynchronous process is controlled either via a pty (pseudo-terminal) or a pipe. The choice of pty or pipe is made when creating the process, based on the value of the variable process-connection-type (see below). Ptys are usually preferable for processes visible to the user, as in Shell mode, because they allow for job control (C-c, C-z, etc.) between the process and its children, whereas pipes do not. For subprocesses used for internal purposes by programs, it is often better to use a pipe, because they are more efficient, and because they are immune to stray character injections that ptys introduce for large (around 500 byte) messages. Also, the total number of ptys is limited on many systems and it is good not to waste them.

Function: start-process name buffer-or-name program &rest args

This function creates a new asynchronous subprocess and starts the program program running in it. It returns a process object that stands for the new subprocess in Lisp. The argument name specifies the name for the process object; if a process with this name already exists, then name is modified (by appending ‘<1>’, etc.) to be unique. The buffer buffer-or-name is the buffer to associate with the process.

If program is nil, Emacs opens a new pseudoterminal (pty) and associates its input and output with buffer-or-name, without creating a subprocess. In that case, the remaining arguments args are ignored.

The remaining arguments, args, are strings that specify command line arguments for the subprocess.

In the example below, the first process is started and runs (rather, sleeps) for 100 seconds (the output buffer ‘foo’ is created immediately). Meanwhile, the second process is started, and given the name ‘my-process<1>’ for the sake of uniqueness. It inserts the directory listing at the end of the buffer ‘foo’, before the first process finishes. Then it finishes, and a message to that effect is inserted in the buffer. Much later, the first process finishes, and another message is inserted in the buffer for it.

(start-process "my-process" "foo" "sleep" "100")
     ⇒ #<process my-process>
(start-process "my-process" "foo" "ls" "-l" "/bin")
     ⇒ #<process my-process<1>>

---------- Buffer: foo ----------
total 8336
-rwxr-xr-x 1 root root 971384 Mar 30 10:14 bash
-rwxr-xr-x 1 root root 146920 Jul  5  2011 bsd-csh
…
-rwxr-xr-x 1 root root 696880 Feb 28 15:55 zsh4

Process my-process<1> finished

Process my-process finished
---------- Buffer: foo ----------
Function: start-file-process name buffer-or-name program &rest args

Like start-process, this function starts a new asynchronous subprocess running program in it, and returns its process object.

The difference from start-process is that this function may invoked a file handler based on the value of default-directory. This handler ought to run program, perhaps on the local host, perhaps on a remote host that corresponds to default-directory. In the latter case, the local part of default-directory becomes the working directory of the process.

This function does not try to invoke file name handlers for program or for the program-args.

Depending on the implementation of the file handler, it might not be possible to apply process-filter or process-sentinel to the resulting process object. See section Process Filter Functions, and Sentinels: Detecting Process Status Changes.

Some file handlers may not support start-file-process (for example the function ange-ftp-hook-function). In such cases, this function does nothing and returns nil.

Function: start-process-shell-command name buffer-or-name command

This function is like start-process, except that it uses a shell to execute the specified command. The argument command is a shell command name. The variable shell-file-name specifies which shell to use.

The point of running a program through the shell, rather than directly with start-process, is so that you can employ shell features such as wildcards in the arguments. It follows that if you include any arbitrary user-specified arguments in the command, you should quote them with shell-quote-argument first, so that any special shell characters do not have their special shell meanings. See section Shell Arguments. Of course, when executing commands based on user input you should also consider the security implications.

Function: start-file-process-shell-command name buffer-or-name command

This function is like start-process-shell-command, but uses start-file-process internally. Because of this, command can also be executed on remote hosts, depending on default-directory.

Variable: process-connection-type

This variable controls the type of device used to communicate with asynchronous subprocesses. If it is non-nil, then ptys are used, when available. Otherwise, pipes are used.

The value of process-connection-type takes effect when start-process is called. So you can specify how to communicate with one subprocess by binding the variable around the call to start-process.

(let ((process-connection-type nil))  ; use a pipe
  (start-process …))

To determine whether a given subprocess actually got a pipe or a pty, use the function process-tty-name (see section Process Information).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.5 Deleting Processes

Deleting a process disconnects Emacs immediately from the subprocess. Processes are deleted automatically after they terminate, but not necessarily right away. You can delete a process explicitly at any time. If you explicitly delete a terminated process before it is deleted automatically, no harm results. Deleting a running process sends a signal to terminate it (and its child processes, if any), and calls the process sentinel. See section Sentinels: Detecting Process Status Changes.

When a process is deleted, the process object itself continues to exist as long as other Lisp objects point to it. All the Lisp primitives that work on process objects accept deleted processes, but those that do I/O or send signals will report an error. The process mark continues to point to the same place as before, usually into a buffer where output from the process was being inserted.

User Option: delete-exited-processes

This variable controls automatic deletion of processes that have terminated (due to calling exit or to a signal). If it is nil, then they continue to exist until the user runs list-processes. Otherwise, they are deleted immediately after they exit.

Function: delete-process process

This function deletes a process, killing it with a SIGKILL signal. The argument may be a process, the name of a process, a buffer, or the name of a buffer. (A buffer or buffer-name stands for the process that get-buffer-process returns.) Calling delete-process on a running process terminates it, updates the process status, and runs the sentinel immediately. If the process has already terminated, calling delete-process has no effect on its status, or on the running of its sentinel (which will happen sooner or later).

(delete-process "*shell*")
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.6 Process Information

Several functions return information about processes.

Command: list-processes &optional query-only buffer

This command displays a listing of all living processes. In addition, it finally deletes any process whose status was ‘Exited’ or ‘Signaled’. It returns nil.

The processes are shown in a buffer named *Process List* (unless you specify otherwise using the optional argument buffer), whose major mode is Process Menu mode.

If query-only is non-nil, it only lists processes whose query flag is non-nil. See section Querying Before Exit.

Function: process-list

This function returns a list of all processes that have not been deleted.

(process-list)
     ⇒ (#<process display-time> #<process shell>)
Function: get-process name

This function returns the process named name (a string), or nil if there is none.

(get-process "shell")
     ⇒ #<process shell>
Function: process-command process

This function returns the command that was executed to start process. This is a list of strings, the first string being the program executed and the rest of the strings being the arguments that were given to the program.

(process-command (get-process "shell"))
     ⇒ ("bash" "-i")
Function: process-contact process &optional key

This function returns information about how a network or serial process was set up. When key is nil, it returns (hostname service) for a network process, and (port speed) for a serial process. For an ordinary child process, this function always returns t.

If key is t, the value is the complete status information for the connection, server, or serial port; that is, the list of keywords and values specified in make-network-process or make-serial-process, except that some of the values represent the current status instead of what you specified.

For a network process, the values include (see make-network-process for a complete list):

:buffer

The associated value is the process buffer.

:filter

The associated value is the process filter function.

:sentinel

The associated value is the process sentinel function.

:remote

In a connection, the address in internal format of the remote peer.

:local

The local address, in internal format.

:service

In a server, if you specified t for service, this value is the actual port number.

:local and :remote are included even if they were not specified explicitly in make-network-process.

For a serial process, see make-serial-process and serial-process-configure for a list of keys.

If key is a keyword, the function returns the value corresponding to that keyword.

Function: process-id process

This function returns the PID of process. This is an integer that distinguishes the process process from all other processes running on the same computer at the current time. The PID of a process is chosen by the operating system kernel when the process is started and remains constant as long as the process exists.

Function: process-name process

This function returns the name of process, as a string.

Function: process-status process-name

This function returns the status of process-name as a symbol. The argument process-name must be a process, a buffer, or a process name (a string).

The possible values for an actual subprocess are:

run

for a process that is running.

stop

for a process that is stopped but continuable.

exit

for a process that has exited.

signal

for a process that has received a fatal signal.

open

for a network connection that is open.

closed

for a network connection that is closed. Once a connection is closed, you cannot reopen it, though you might be able to open a new connection to the same place.

connect

for a non-blocking connection that is waiting to complete.

failed

for a non-blocking connection that has failed to complete.

listen

for a network server that is listening.

nil

if process-name is not the name of an existing process.

(process-status (get-buffer "*shell*"))
     ⇒ run

For a network connection, process-status returns one of the symbols open or closed. The latter means that the other side closed the connection, or Emacs did delete-process.

Function: process-live-p process

This function returns non-nil if process is alive. A process is considered alive if its status is run, open, listen, connect or stop.

Function: process-type process

This function returns the symbol network for a network connection or server, serial for a serial port connection, or real for a real subprocess.

Function: process-exit-status process

This function returns the exit status of process or the signal number that killed it. (Use the result of process-status to determine which of those it is.) If process has not yet terminated, the value is 0.

Function: process-tty-name process

This function returns the terminal name that process is using for its communication with Emacs—or nil if it is using pipes instead of a terminal (see process-connection-type in Creating an Asynchronous Process). If process represents a program running on a remote host, the terminal name used by that program on the remote host is provided as process property remote-tty.

Function: process-coding-system process

This function returns a cons cell (decode . encode), describing the coding systems in use for decoding output from, and encoding input to, process (see section Coding Systems).

Function: set-process-coding-system process &optional decoding-system encoding-system

This function specifies the coding systems to use for subsequent output from and input to process. It will use decoding-system to decode subprocess output, and encoding-system to encode subprocess input.

Every process also has a property list that you can use to store miscellaneous values associated with the process.

Function: process-get process propname

This function returns the value of the propname property of process.

Function: process-put process propname value

This function sets the value of the propname property of process to value.

Function: process-plist process

This function returns the process plist of process.

Function: set-process-plist process plist

This function sets the process plist of process to plist.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.7 Sending Input to Processes

Asynchronous subprocesses receive input when it is sent to them by Emacs, which is done with the functions in this section. You must specify the process to send input to, and the input data to send. The data appears on the “standard input” of the subprocess.

Some operating systems have limited space for buffered input in a pty. On these systems, Emacs sends an EOF periodically amidst the other characters, to force them through. For most programs, these EOFs do no harm.

Subprocess input is normally encoded using a coding system before the subprocess receives it, much like text written into a file. You can use set-process-coding-system to specify which coding system to use (see section Process Information). Otherwise, the coding system comes from coding-system-for-write, if that is non-nil; or else from the defaulting mechanism (see section Default Coding Systems).

Sometimes the system is unable to accept input for that process, because the input buffer is full. When this happens, the send functions wait a short while, accepting output from subprocesses, and then try again. This gives the subprocess a chance to read more of its pending input and make space in the buffer. It also allows filters, sentinels and timers to run—so take account of that in writing your code.

In these functions, the process argument can be a process or the name of a process, or a buffer or buffer name (which stands for a process via get-buffer-process). nil means the current buffer’s process.

Function: process-send-string process string

This function sends process the contents of string as standard input. It returns nil. For example, to make a Shell buffer list files:

(process-send-string "shell<1>" "ls\n")
     ⇒ nil
Function: process-send-region process start end

This function sends the text in the region defined by start and end as standard input to process.

An error is signaled unless both start and end are integers or markers that indicate positions in the current buffer. (It is unimportant which number is larger.)

Function: process-send-eof &optional process

This function makes process see an end-of-file in its input. The EOF comes after any text already sent to it. The function returns process.

(process-send-eof "shell")
     ⇒ "shell"
Function: process-running-child-p &optional process

This function will tell you whether a process has given control of its terminal to its own child process. The value is t if this is true, or if Emacs cannot tell; it is nil if Emacs can be certain that this is not so.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.8 Sending Signals to Processes

Sending a signal to a subprocess is a way of interrupting its activities. There are several different signals, each with its own meaning. The set of signals and their names is defined by the operating system. For example, the signal SIGINT means that the user has typed C-c, or that some analogous thing has happened.

Each signal has a standard effect on the subprocess. Most signals kill the subprocess, but some stop (or resume) execution instead. Most signals can optionally be handled by programs; if the program handles the signal, then we can say nothing in general about its effects.

You can send signals explicitly by calling the functions in this section. Emacs also sends signals automatically at certain times: killing a buffer sends a SIGHUP signal to all its associated processes; killing Emacs sends a SIGHUP signal to all remaining processes. (SIGHUP is a signal that usually indicates that the user “hung up the phone”, i.e., disconnected.)

Each of the signal-sending functions takes two optional arguments: process and current-group.

The argument process must be either a process, a process name, a buffer, a buffer name, or nil. A buffer or buffer name stands for a process through get-buffer-process. nil stands for the process associated with the current buffer. An error is signaled if process does not identify a process.

The argument current-group is a flag that makes a difference when you are running a job-control shell as an Emacs subprocess. If it is non-nil, then the signal is sent to the current process-group of the terminal that Emacs uses to communicate with the subprocess. If the process is a job-control shell, this means the shell’s current subjob. If it is nil, the signal is sent to the process group of the immediate subprocess of Emacs. If the subprocess is a job-control shell, this is the shell itself.

The flag current-group has no effect when a pipe is used to communicate with the subprocess, because the operating system does not support the distinction in the case of pipes. For the same reason, job-control shells won’t work when a pipe is used. See process-connection-type in Creating an Asynchronous Process.

Function: interrupt-process &optional process current-group

This function interrupts the process process by sending the signal SIGINT. Outside of Emacs, typing the “interrupt character” (normally C-c on some systems, and DEL on others) sends this signal. When the argument current-group is non-nil, you can think of this function as “typing C-c” on the terminal by which Emacs talks to the subprocess.

Function: kill-process &optional process current-group

This function kills the process process by sending the signal SIGKILL. This signal kills the subprocess immediately, and cannot be handled by the subprocess.

Function: quit-process &optional process current-group

This function sends the signal SIGQUIT to the process process. This signal is the one sent by the “quit character” (usually C-b or C-\) when you are not inside Emacs.

Function: stop-process &optional process current-group

This function stops the process process by sending the signal SIGTSTP. Use continue-process to resume its execution.

Outside of Emacs, on systems with job control, the “stop character” (usually C-z) normally sends this signal. When current-group is non-nil, you can think of this function as “typing C-z” on the terminal Emacs uses to communicate with the subprocess.

Function: continue-process &optional process current-group

This function resumes execution of the process process by sending it the signal SIGCONT. This presumes that process was stopped previously.

Command: signal-process process signal

This function sends a signal to process process. The argument signal specifies which signal to send; it should be an integer, or a symbol whose name is a signal.

The process argument can be a system process ID (an integer); that allows you to send signals to processes that are not children of Emacs. See section Accessing Other Processes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9 Receiving Output from Processes

The output that a subprocess writes to its standard output stream is passed to a function called the filter function. The default filter function simply inserts the output into a buffer, which is called the associated buffer of the process (see section Process Buffers). If the process has no buffer then the default filter discards the output.

When a subprocess terminates, Emacs reads any pending output, then stops reading output from that subprocess. Therefore, if the subprocess has children that are still live and still producing output, Emacs won’t receive that output.

Output from a subprocess can arrive only while Emacs is waiting: when reading terminal input (see the function waiting-for-user-input-p), in sit-for and sleep-for (see section Waiting for Elapsed Time or Input), and in accept-process-output (see section Accepting Output from Processes). This minimizes the problem of timing errors that usually plague parallel programming. For example, you can safely create a process and only then specify its buffer or filter function; no output can arrive before you finish, if the code in between does not call any primitive that waits.

Variable: process-adaptive-read-buffering

On some systems, when Emacs reads the output from a subprocess, the output data is read in very small blocks, potentially resulting in very poor performance. This behavior can be remedied to some extent by setting the variable process-adaptive-read-buffering to a non-nil value (the default), as it will automatically delay reading from such processes, thus allowing them to produce more output before Emacs tries to read it.

It is impossible to separate the standard output and standard error streams of the subprocess, because Emacs normally spawns the subprocess inside a pseudo-TTY, and a pseudo-TTY has only one output channel. If you want to keep the output to those streams separate, you should redirect one of them to a file—for example, by using an appropriate shell command.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9.1 Process Buffers

A process can (and usually does) have an associated buffer, which is an ordinary Emacs buffer that is used for two purposes: storing the output from the process, and deciding when to kill the process. You can also use the buffer to identify a process to operate on, since in normal practice only one process is associated with any given buffer. Many applications of processes also use the buffer for editing input to be sent to the process, but this is not built into Emacs Lisp.

By default, process output is inserted in the associated buffer. (You can change this by defining a custom filter function, see section Process Filter Functions.) The position to insert the output is determined by the process-mark, which is then updated to point to the end of the text just inserted. Usually, but not always, the process-mark is at the end of the buffer.

Killing the associated buffer of a process also kills the process. Emacs asks for confirmation first, if the process’s process-query-on-exit-flag is non-nil (see section Querying Before Exit). This confirmation is done by the function process-kill-buffer-query-function, which is run from kill-buffer-query-functions (see section Killing Buffers).

Function: process-buffer process

This function returns the associated buffer of the process process.

(process-buffer (get-process "shell"))
     ⇒ #<buffer *shell*>
Function: process-mark process

This function returns the process marker for process, which is the marker that says where to insert output from the process.

If process does not have a buffer, process-mark returns a marker that points nowhere.

The default filter function uses this marker to decide where to insert process output, and updates it to point after the inserted text. That is why successive batches of output are inserted consecutively.

Custom filter functions normally should use this marker in the same fashion. For an example of a filter function that uses process-mark, see Process Filter Example.

When the user is expected to enter input in the process buffer for transmission to the process, the process marker separates the new input from previous output.

Function: set-process-buffer process buffer

This function sets the buffer associated with process to buffer. If buffer is nil, the process becomes associated with no buffer.

Function: get-buffer-process buffer-or-name

This function returns a nondeleted process associated with the buffer specified by buffer-or-name. If there are several processes associated with it, this function chooses one (currently, the one most recently created, but don’t count on that). Deletion of a process (see delete-process) makes it ineligible for this function to return.

It is usually a bad idea to have more than one process associated with the same buffer.

(get-buffer-process "*shell*")
     ⇒ #<process shell>

Killing the process’s buffer deletes the process, which kills the subprocess with a SIGHUP signal (see section Sending Signals to Processes).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9.2 Process Filter Functions

A process filter function is a function that receives the standard output from the associated process. All output from that process is passed to the filter. The default filter simply outputs directly to the process buffer.

The filter function can only be called when Emacs is waiting for something, because process output arrives only at such times. Emacs waits when reading terminal input (see the function waiting-for-user-input-p), in sit-for and sleep-for (see section Waiting for Elapsed Time or Input), and in accept-process-output (see section Accepting Output from Processes).

A filter function must accept two arguments: the associated process and a string, which is output just received from it. The function is then free to do whatever it chooses with the output.

Quitting is normally inhibited within a filter function—otherwise, the effect of typing C-g at command level or to quit a user command would be unpredictable. If you want to permit quitting inside a filter function, bind inhibit-quit to nil. In most cases, the right way to do this is with the macro with-local-quit. See section Quitting.

If an error happens during execution of a filter function, it is caught automatically, so that it doesn’t stop the execution of whatever program was running when the filter function was started. However, if debug-on-error is non-nil, errors are not caught. This makes it possible to use the Lisp debugger to debug the filter function. See section The Lisp Debugger.

Many filter functions sometimes (or always) insert the output in the process’s buffer, mimicking the actions of the default filter. Such filter functions need to make sure that they save the current buffer, select the correct buffer (if different) before inserting output, and then restore the original buffer. They should also check whether the buffer is still alive, update the process marker, and in some cases update the value of point. Here is how to do these things:

(defun ordinary-insertion-filter (proc string)
  (when (buffer-live-p (process-buffer proc))
    (with-current-buffer (process-buffer proc)
      (let ((moving (= (point) (process-mark proc))))
        (save-excursion
          ;; Insert the text, advancing the process marker.
          (goto-char (process-mark proc))
          (insert string)
          (set-marker (process-mark proc) (point)))
        (if moving (goto-char (process-mark proc)))))))

To make the filter force the process buffer to be visible whenever new text arrives, you could insert a line like the following just before the with-current-buffer construct:

(display-buffer (process-buffer proc))

To force point to the end of the new output, no matter where it was previously, eliminate the variable moving and call goto-char unconditionally.

Note that Emacs automatically saves and restores the match data while executing filter functions. See section The Match Data.

The output to the filter may come in chunks of any size. A program that produces the same output twice in a row may send it as one batch of 200 characters one time, and five batches of 40 characters the next. If the filter looks for certain text strings in the subprocess output, make sure to handle the case where one of these strings is split across two or more batches of output; one way to do this is to insert the received text into a temporary buffer, which can then be searched.

Function: set-process-filter process filter

This function gives process the filter function filter. If filter is nil, it gives the process the default filter, which inserts the process output into the process buffer.

Function: process-filter process

This function returns the filter function of process.

In case the process’s output needs to be passed to several filters, you can use add-function to combine an existing filter with a new one. See section Advising Emacs Lisp Functions.

Here is an example of the use of a filter function:

(defun keep-output (process output)
   (setq kept (cons output kept)))
     ⇒ keep-output
(setq kept nil)
     ⇒ nil
(set-process-filter (get-process "shell") 'keep-output)
     ⇒ keep-output
(process-send-string "shell" "ls ~/other\n")
     ⇒ nil
kept
     ⇒ ("lewis@slug:$ "
"FINAL-W87-SHORT.MSS    backup.otl              kolstad.mss~
address.txt             backup.psf              kolstad.psf
backup.bib~             david.mss               resume-Dec-86.mss~
backup.err              david.psf               resume-Dec.psf
backup.mss              dland                   syllabus.mss
"
"#backups.mss#          backup.mss~             kolstad.mss
")

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9.3 Decoding Process Output

When Emacs writes process output directly into a multibyte buffer, it decodes the output according to the process output coding system. If the coding system is raw-text or no-conversion, Emacs converts the unibyte output to multibyte using string-to-multibyte, and inserts the resulting multibyte text.

You can use set-process-coding-system to specify which coding system to use (see section Process Information). Otherwise, the coding system comes from coding-system-for-read, if that is non-nil; or else from the defaulting mechanism (see section Default Coding Systems). If the text output by a process contains null bytes, Emacs by default uses no-conversion for it; see inhibit-null-byte-detection, for how to control this behavior.

Warning: Coding systems such as undecided, which determine the coding system from the data, do not work entirely reliably with asynchronous subprocess output. This is because Emacs has to process asynchronous subprocess output in batches, as it arrives. Emacs must try to detect the proper coding system from one batch at a time, and this does not always work. Therefore, if at all possible, specify a coding system that determines both the character code conversion and the end of line conversion—that is, one like latin-1-unix, rather than undecided or latin-1.

When Emacs calls a process filter function, it provides the process output as a multibyte string or as a unibyte string according to the process’s filter coding system. Emacs decodes the output according to the process output coding system, which usually produces a multibyte string, except for coding systems such as binary and raw-text.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9.4 Accepting Output from Processes

Output from asynchronous subprocesses normally arrives only while Emacs is waiting for some sort of external event, such as elapsed time or terminal input. Occasionally it is useful in a Lisp program to explicitly permit output to arrive at a specific point, or even to wait until output arrives from a process.

Function: accept-process-output &optional process seconds millisec just-this-one

This function allows Emacs to read pending output from processes. The output is given to their filter functions. If process is non-nil then this function does not return until some output has been received from process.

The arguments seconds and millisec let you specify timeout periods. The former specifies a period measured in seconds and the latter specifies one measured in milliseconds. The two time periods thus specified are added together, and accept-process-output returns after that much time, whether or not there has been any subprocess output.

The argument millisec is obsolete (and should not be used), because seconds can be floating point to specify waiting a fractional number of seconds. If seconds is 0, the function accepts whatever output is pending but does not wait.

If process is a process, and the argument just-this-one is non-nil, only output from that process is handled, suspending output from other processes until some output has been received from that process or the timeout expires. If just-this-one is an integer, also inhibit running timers. This feature is generally not recommended, but may be necessary for specific applications, such as speech synthesis.

The function accept-process-output returns non-nil if it did get some output, or nil if the timeout expired before output arrived.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.10 Sentinels: Detecting Process Status Changes

A process sentinel is a function that is called whenever the associated process changes status for any reason, including signals (whether sent by Emacs or caused by the process’s own actions) that terminate, stop, or continue the process. The process sentinel is also called if the process exits. The sentinel receives two arguments: the process for which the event occurred, and a string describing the type of event.

The string describing the event looks like one of the following:

A sentinel runs only while Emacs is waiting (e.g., for terminal input, or for time to elapse, or for process output). This avoids the timing errors that could result from running sentinels at random places in the middle of other Lisp programs. A program can wait, so that sentinels will run, by calling sit-for or sleep-for (see section Waiting for Elapsed Time or Input), or accept-process-output (see section Accepting Output from Processes). Emacs also allows sentinels to run when the command loop is reading input. delete-process calls the sentinel when it terminates a running process.

Emacs does not keep a queue of multiple reasons to call the sentinel of one process; it records just the current status and the fact that there has been a change. Therefore two changes in status, coming in quick succession, can call the sentinel just once. However, process termination will always run the sentinel exactly once. This is because the process status can’t change again after termination.

Emacs explicitly checks for output from the process before running the process sentinel. Once the sentinel runs due to process termination, no further output can arrive from the process.

A sentinel that writes the output into the buffer of the process should check whether the buffer is still alive. If it tries to insert into a dead buffer, it will get an error. If the buffer is dead, (buffer-name (process-buffer process)) returns nil.

Quitting is normally inhibited within a sentinel—otherwise, the effect of typing C-g at command level or to quit a user command would be unpredictable. If you want to permit quitting inside a sentinel, bind inhibit-quit to nil. In most cases, the right way to do this is with the macro with-local-quit. See section Quitting.

If an error happens during execution of a sentinel, it is caught automatically, so that it doesn’t stop the execution of whatever programs was running when the sentinel was started. However, if debug-on-error is non-nil, errors are not caught. This makes it possible to use the Lisp debugger to debug the sentinel. See section The Lisp Debugger.

While a sentinel is running, the process sentinel is temporarily set to nil so that the sentinel won’t run recursively. For this reason it is not possible for a sentinel to specify a new sentinel.

Note that Emacs automatically saves and restores the match data while executing sentinels. See section The Match Data.

Function: set-process-sentinel process sentinel

This function associates sentinel with process. If sentinel is nil, then the process will have the default sentinel, which inserts a message in the process’s buffer when the process status changes.

Changes in process sentinels take effect immediately—if the sentinel is slated to be run but has not been called yet, and you specify a new sentinel, the eventual call to the sentinel will use the new one.

(defun msg-me (process event)
   (princ
     (format "Process: %s had the event `%s'" process event)))
(set-process-sentinel (get-process "shell") 'msg-me)
     ⇒ msg-me
(kill-process (get-process "shell"))
     -| Process: #<process shell> had the event `killed'
     ⇒ #<process shell>
Function: process-sentinel process

This function returns the sentinel of process.

In case a process status changes need to be passed to several sentinels, you can use add-function to combine an existing sentinel with a new one. See section Advising Emacs Lisp Functions.

Function: waiting-for-user-input-p

While a sentinel or filter function is running, this function returns non-nil if Emacs was waiting for keyboard input from the user at the time the sentinel or filter function was called, or nil if it was not.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.11 Querying Before Exit

When Emacs exits, it terminates all its subprocesses by sending them the SIGHUP signal. Because subprocesses may be doing valuable work, Emacs normally asks the user to confirm that it is ok to terminate them. Each process has a query flag, which, if non-nil, says that Emacs should ask for confirmation before exiting and thus killing that process. The default for the query flag is t, meaning do query.

Function: process-query-on-exit-flag process

This returns the query flag of process.

Function: set-process-query-on-exit-flag process flag

This function sets the query flag of process to flag. It returns flag.

Here is an example of using set-process-query-on-exit-flag on a shell process to avoid querying:

(set-process-query-on-exit-flag (get-process "shell") nil)
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.12 Accessing Other Processes

In addition to accessing and manipulating processes that are subprocesses of the current Emacs session, Emacs Lisp programs can also access other processes running on the same machine. We call these system processes, to distinguish them from Emacs subprocesses.

Emacs provides several primitives for accessing system processes. Not all platforms support these primitives; on those which don’t, these primitives return nil.

Function: list-system-processes

This function returns a list of all the processes running on the system. Each process is identified by its PID, a numerical process ID that is assigned by the OS and distinguishes the process from all the other processes running on the same machine at the same time.

Function: process-attributes pid

This function returns an alist of attributes for the process specified by its process ID pid. Each association in the alist is of the form (key . value), where key designates the attribute and value is the value of that attribute. The various attribute keys that this function can return are listed below. Not all platforms support all of these attributes; if an attribute is not supported, its association will not appear in the returned alist. Values that are numbers can be either integer or floating point, depending on the magnitude of the value.

euid

The effective user ID of the user who invoked the process. The corresponding value is a number. If the process was invoked by the same user who runs the current Emacs session, the value is identical to what user-uid returns (see section User Identification).

user

User name corresponding to the process’s effective user ID, a string.

egid

The group ID of the effective user ID, a number.

group

Group name corresponding to the effective user’s group ID, a string.

comm

The name of the command that runs in the process. This is a string that usually specifies the name of the executable file of the process, without the leading directories. However, some special system processes can report strings that do not correspond to an executable file of a program.

state

The state code of the process. This is a short string that encodes the scheduling state of the process. Here’s a list of the most frequently seen codes:

"D"

uninterruptible sleep (usually I/O)

"R"

running

"S"

interruptible sleep (waiting for some event)

"T"

stopped, e.g., by a job control signal

"Z"

“zombie”: a process that terminated, but was not reaped by its parent

For the full list of the possible states, see the manual page of the ps command.

ppid

The process ID of the parent process, a number.

pgrp

The process group ID of the process, a number.

sess

The session ID of the process. This is a number that is the process ID of the process’s session leader.

ttname

A string that is the name of the process’s controlling terminal. On Unix and GNU systems, this is normally the file name of the corresponding terminal device, such as /dev/pts65.

tpgid

The numerical process group ID of the foreground process group that uses the process’s terminal.

minflt

The number of minor page faults caused by the process since its beginning. (Minor page faults are those that don’t involve reading from disk.)

majflt

The number of major page faults caused by the process since its beginning. (Major page faults require a disk to be read, and are thus more expensive than minor page faults.)

cminflt
cmajflt

Like minflt and majflt, but include the number of page faults for all the child processes of the given process.

utime

Time spent by the process in the user context, for running the application’s code. The corresponding value is in the (high low microsec picosec) format, the same format used by functions current-time (see section current-time) and file-attributes (see section File Attributes).

stime

Time spent by the process in the system (kernel) context, for processing system calls. The corresponding value is in the same format as for utime.

time

The sum of utime and stime. The corresponding value is in the same format as for utime.

cutime
cstime
ctime

Like utime, stime, and time, but include the times of all the child processes of the given process.

pri

The numerical priority of the process.

nice

The nice value of the process, a number. (Processes with smaller nice values get scheduled more favorably.)

thcount

The number of threads in the process.

start

The time when the process was started, in the same (high low microsec picosec) format used by file-attributes and current-time.

etime

The time elapsed since the process started, in the format (high low microsec picosec).

vsize

The virtual memory size of the process, measured in kilobytes.

rss

The size of the process’s resident set, the number of kilobytes occupied by the process in the machine’s physical memory.

pcpu

The percentage of the CPU time used by the process since it started. The corresponding value is a floating-point number between 0 and 100.

pmem

The percentage of the total physical memory installed on the machine used by the process’s resident set. The value is a floating-point number between 0 and 100.

args

The command-line with which the process was invoked. This is a string in which individual command-line arguments are separated by blanks; whitespace characters that are embedded in the arguments are quoted as appropriate for the system’s shell: escaped by backslash characters on GNU and Unix, and enclosed in double quote characters on Windows. Thus, this command-line string can be directly used in primitives such as shell-command.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.13 Transaction Queues

You can use a transaction queue to communicate with a subprocess using transactions. First use tq-create to create a transaction queue communicating with a specified process. Then you can call tq-enqueue to send a transaction.

Function: tq-create process

This function creates and returns a transaction queue communicating with process. The argument process should be a subprocess capable of sending and receiving streams of bytes. It may be a child process, or it may be a TCP connection to a server, possibly on another machine.

Function: tq-enqueue queue question regexp closure fn &optional delay-question

This function sends a transaction to queue queue. Specifying the queue has the effect of specifying the subprocess to talk to.

The argument question is the outgoing message that starts the transaction. The argument fn is the function to call when the corresponding answer comes back; it is called with two arguments: closure, and the answer received.

The argument regexp is a regular expression that should match text at the end of the entire answer, but nothing before; that’s how tq-enqueue determines where the answer ends.

If the argument delay-question is non-nil, delay sending this question until the process has finished replying to any previous questions. This produces more reliable results with some processes.

Function: tq-close queue

Shut down transaction queue queue, waiting for all pending transactions to complete, and then terminate the connection or child process.

Transaction queues are implemented by means of a filter function. See section Process Filter Functions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.14 Network Connections

Emacs Lisp programs can open stream (TCP) and datagram (UDP) network connections (see section Datagrams) to other processes on the same machine or other machines. A network connection is handled by Lisp much like a subprocess, and is represented by a process object. However, the process you are communicating with is not a child of the Emacs process, has no process ID, and you can’t kill it or send it signals. All you can do is send and receive data. delete-process closes the connection, but does not kill the program at the other end; that program must decide what to do about closure of the connection.

Lisp programs can listen for connections by creating network servers. A network server is also represented by a kind of process object, but unlike a network connection, the network server never transfers data itself. When it receives a connection request, it creates a new network connection to represent the connection just made. (The network connection inherits certain information, including the process plist, from the server.) The network server then goes back to listening for more connection requests.

Network connections and servers are created by calling make-network-process with an argument list consisting of keyword/argument pairs, for example :server t to create a server process, or :type 'datagram to create a datagram connection. See section Low-Level Network Access, for details. You can also use the open-network-stream function described below.

To distinguish the different types of processes, the process-type function returns the symbol network for a network connection or server, serial for a serial port connection, or real for a real subprocess.

The process-status function returns open, closed, connect, or failed for network connections. For a network server, the status is always listen. None of those values is possible for a real subprocess. See section Process Information.

You can stop and resume operation of a network process by calling stop-process and continue-process. For a server process, being stopped means not accepting new connections. (Up to 5 connection requests will be queued for when you resume the server; you can increase this limit, unless it is imposed by the operating system—see the :server keyword of make-network-process, make-network-process.) For a network stream connection, being stopped means not processing input (any arriving input waits until you resume the connection). For a datagram connection, some number of packets may be queued but input may be lost. You can use the function process-command to determine whether a network connection or server is stopped; a non-nil value means yes.

Emacs can create encrypted network connections, using either built-in or external support. The built-in support uses the GnuTLS (“Transport Layer Security”) library; see the GnuTLS project page. If your Emacs was compiled with GnuTLS support, the function gnutls-available-p is defined and returns non-nil. For more details, see Overview in The Emacs-GnuTLS manual. The external support uses the starttls.el library, which requires a helper utility such as gnutls-cli to be installed on the system. The open-network-stream function can transparently handle the details of creating encrypted connections for you, using whatever support is available.

Function: open-network-stream name buffer host service &rest parameters

This function opens a TCP connection, with optional encryption, and returns a process object that represents the connection.

The name argument specifies the name for the process object. It is modified as necessary to make it unique.

The buffer argument is the buffer to associate with the connection. Output from the connection is inserted in the buffer, unless you specify your own filter function to handle the output. If buffer is nil, it means that the connection is not associated with any buffer.

The arguments host and service specify where to connect to; host is the host name (a string), and service is the name of a defined network service (a string) or a port number (an integer).

The remaining arguments parameters are keyword/argument pairs that are mainly relevant to encrypted connections:

:nowait boolean

If non-nil, try to make an asynchronous connection.

:type type

The type of connection. Options are:

plain

An ordinary, unencrypted connection.

tls
ssl

A TLS (“Transport Layer Security”) connection.

nil
network

Start with a plain connection, and if parameters ‘:success’ and ‘:capability-command’ are supplied, try to upgrade to an encrypted connection via STARTTLS. If that fails, retain the unencrypted connection.

starttls

As for nil, but if STARTTLS fails drop the connection.

shell

A shell connection.

:always-query-capabilities boolean

If non-nil, always ask for the server’s capabilities, even when doing a ‘plain’ connection.

:capability-command capability-command

Command string to query the host capabilities.

:end-of-command regexp
:end-of-capability regexp

Regular expression matching the end of a command, or the end of the command capability-command. The latter defaults to the former.

:starttls-function function

Function of one argument (the response to capability-command), which returns either nil, or the command to activate STARTTLS if supported.

:success regexp

Regular expression matching a successful STARTTLS negotiation.

:use-starttls-if-possible boolean

If non-nil, do opportunistic STARTTLS upgrades even if Emacs doesn’t have built-in TLS support.

:client-certificate list-or-t

Either a list of the form (key-file cert-file), naming the certificate key file and certificate file itself, or t, meaning to query auth-source for this information (see Overview in The Auth-Source Manual). Only used for TLS or STARTTLS.

:return-list cons-or-nil

The return value of this function. If omitted or nil, return a process object. Otherwise, a cons of the form (process-object . plist), where plist has keywords:

:greeting string-or-nil

If non-nil, the greeting string returned by the host.

:capabilities string-or-nil

If non-nil, the host’s capability string.

:type symbol

The connection type: ‘plain’ or ‘tls’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.15 Network Servers

You create a server by calling make-network-process (see section make-network-process) with :server t. The server will listen for connection requests from clients. When it accepts a client connection request, that creates a new network connection, itself a process object, with the following parameters:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.16 Datagrams

A datagram connection communicates with individual packets rather than streams of data. Each call to process-send sends one datagram packet (see section Sending Input to Processes), and each datagram received results in one call to the filter function.

The datagram connection doesn’t have to talk with the same remote peer all the time. It has a remote peer address which specifies where to send datagrams to. Each time an incoming datagram is passed to the filter function, the peer address is set to the address that datagram came from; that way, if the filter function sends a datagram, it will go back to that place. You can specify the remote peer address when you create the datagram connection using the :remote keyword. You can change it later on by calling set-process-datagram-address.

Function: process-datagram-address process

If process is a datagram connection or server, this function returns its remote peer address.

Function: set-process-datagram-address process address

If process is a datagram connection or server, this function sets its remote peer address to address.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.17 Low-Level Network Access

You can also create network connections by operating at a lower level than that of open-network-stream, using make-network-process.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.17.1 make-network-process

The basic function for creating network connections and network servers is make-network-process. It can do either of those jobs, depending on the arguments you give it.

Function: make-network-process &rest args

This function creates a network connection or server and returns the process object that represents it. The arguments args are a list of keyword/argument pairs. Omitting a keyword is always equivalent to specifying it with value nil, except for :coding, :filter-multibyte, and :reuseaddr. Here are the meaningful keywords (those corresponding to network options are listed in the following section):

:name name

Use the string name as the process name. It is modified if necessary to make it unique.

:type type

Specify the communication type. A value of nil specifies a stream connection (the default); datagram specifies a datagram connection; seqpacket specifies a “sequenced packet stream” connection. Both connections and servers can be of these types.

:server server-flag

If server-flag is non-nil, create a server. Otherwise, create a connection. For a stream type server, server-flag may be an integer, which then specifies the length of the queue of pending connections to the server. The default queue length is 5.

:host host

Specify the host to connect to. host should be a host name or Internet address, as a string, or the symbol local to specify the local host. If you specify host for a server, it must specify a valid address for the local host, and only clients connecting to that address will be accepted.

:service service

service specifies a port number to connect to; or, for a server, the port number to listen on. It should be a service name that translates to a port number, or an integer specifying the port number directly. For a server, it can also be t, which means to let the system select an unused port number.

:family family

family specifies the address (and protocol) family for communication. nil means determine the proper address family automatically for the given host and service. local specifies a Unix socket, in which case host is ignored. ipv4 and ipv6 specify to use IPv4 and IPv6, respectively.

:local local-address

For a server process, local-address is the address to listen on. It overrides family, host and service, so you might as well not specify them.

:remote remote-address

For a connection, remote-address is the address to connect to. It overrides family, host and service, so you might as well not specify them.

For a datagram server, remote-address specifies the initial setting of the remote datagram address.

The format of local-address or remote-address depends on the address family:

  • - An IPv4 address is represented as a five-element vector of four 8-bit integers and one 16-bit integer [a b c d p] corresponding to numeric IPv4 address a.b.c.d and port number p.
  • - An IPv6 address is represented as a nine-element vector of 16-bit integers [a b c d e f g h p] corresponding to numeric IPv6 address a:b:c:d:e:f:g:h and port number p.
  • - A local address is represented as a string, which specifies the address in the local address space.
  • - An “unsupported family” address is represented by a cons (f . av), where f is the family number and av is a vector specifying the socket address using one element per address data byte. Do not rely on this format in portable code, as it may depend on implementation defined constants, data sizes, and data structure alignment.
:nowait bool

If bool is non-nil for a stream connection, return without waiting for the connection to complete. When the connection succeeds or fails, Emacs will call the sentinel function, with a second argument matching "open" (if successful) or "failed". The default is to block, so that make-network-process does not return until the connection has succeeded or failed.

:stop stopped

If stopped is non-nil, start the network connection or server in the “stopped” state.

:buffer buffer

Use buffer as the process buffer.

:coding coding

Use coding as the coding system for this process. To specify different coding systems for decoding data from the connection and for encoding data sent to it, specify (decoding . encoding) for coding.

If you don’t specify this keyword at all, the default is to determine the coding systems from the data.

:noquery query-flag

Initialize the process query flag to query-flag. See section Querying Before Exit.

:filter filter

Initialize the process filter to filter.

:filter-multibyte multibyte

If multibyte is non-nil, strings given to the process filter are multibyte, otherwise they are unibyte. The default is the default value of enable-multibyte-characters.

:sentinel sentinel

Initialize the process sentinel to sentinel.

:log log

Initialize the log function of a server process to log. The log function is called each time the server accepts a network connection from a client. The arguments passed to the log function are server, connection, and message; where server is the server process, connection is the new process for the connection, and message is a string describing what has happened.

:plist plist

Initialize the process plist to plist.

The original argument list, modified with the actual connection information, is available via the process-contact function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.17.2 Network Options

The following network options can be specified when you create a network process. Except for :reuseaddr, you can also set or modify these options later, using set-network-process-option.

For a server process, the options specified with make-network-process are not inherited by the client connections, so you will need to set the necessary options for each child connection as it is created.

:bindtodevice device-name

If device-name is a non-empty string identifying a network interface name (see network-interface-list), only handle packets received on that interface. If device-name is nil (the default), handle packets received on any interface.

Using this option may require special privileges on some systems.

:broadcast broadcast-flag

If broadcast-flag is non-nil for a datagram process, the process will receive datagram packet sent to a broadcast address, and be able to send packets to a broadcast address. This is ignored for a stream connection.

:dontroute dontroute-flag

If dontroute-flag is non-nil, the process can only send to hosts on the same network as the local host.

:keepalive keepalive-flag

If keepalive-flag is non-nil for a stream connection, enable exchange of low-level keep-alive messages.

:linger linger-arg

If linger-arg is non-nil, wait for successful transmission of all queued packets on the connection before it is deleted (see delete-process). If linger-arg is an integer, it specifies the maximum time in seconds to wait for queued packets to be sent before closing the connection. The default is nil, which means to discard unsent queued packets when the process is deleted.

:oobinline oobinline-flag

If oobinline-flag is non-nil for a stream connection, receive out-of-band data in the normal data stream. Otherwise, ignore out-of-band data.

:priority priority

Set the priority for packets sent on this connection to the integer priority. The interpretation of this number is protocol specific; such as setting the TOS (type of service) field on IP packets sent on this connection. It may also have system dependent effects, such as selecting a specific output queue on the network interface.

:reuseaddr reuseaddr-flag

If reuseaddr-flag is non-nil (the default) for a stream server process, allow this server to reuse a specific port number (see :service), unless another process on this host is already listening on that port. If reuseaddr-flag is nil, there may be a period of time after the last use of that port (by any process on the host) where it is not possible to make a new server on that port.

Function: set-network-process-option process option value &optional no-error

This function sets or modifies a network option for network process process. The accepted options and values are as for make-network-process. If no-error is non-nil, this function returns nil instead of signaling an error if option is not a supported option. If the function successfully completes, it returns t.

The current setting of an option is available via the process-contact function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.17.3 Testing Availability of Network Features

To test for the availability of a given network feature, use featurep like this:

(featurep 'make-network-process '(keyword value))

The result of this form is t if it works to specify keyword with value value in make-network-process. Here are some of the keywordvalue pairs you can test in this way.

(:nowait t)

Non-nil if non-blocking connect is supported.

(:type datagram)

Non-nil if datagrams are supported.

(:family local)

Non-nil if local (a.k.a. “UNIX domain”) sockets are supported.

(:family ipv6)

Non-nil if IPv6 is supported.

(:service t)

Non-nil if the system can select the port for a server.

To test for the availability of a given network option, use featurep like this:

(featurep 'make-network-process 'keyword)

The accepted keyword values are :bindtodevice, etc. For the complete list, see section Network Options. This form returns non-nil if that particular network option is supported by make-network-process (or set-network-process-option).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.18 Misc Network Facilities

These additional functions are useful for creating and operating on network connections. Note that they are supported only on some systems.

Function: network-interface-list

This function returns a list describing the network interfaces of the machine you are using. The value is an alist whose elements have the form (name . address). address has the same form as the local-address and remote-address arguments to make-network-process.

Function: network-interface-info ifname

This function returns information about the network interface named ifname. The value is a list of the form (addr bcast netmask hwaddr flags).

addr

The Internet protocol address.

bcast

The broadcast address.

netmask

The network mask.

hwaddr

The layer 2 address (Ethernet MAC address, for instance).

flags

The current flags of the interface.

Function: format-network-address address &optional omit-port

This function converts the Lisp representation of a network address to a string.

A five-element vector [a b c d p] represents an IPv4 address a.b.c.d and port number p. format-network-address converts that to the string "a.b.c.d:p".

A nine-element vector [a b c d e f g h p] represents an IPv6 address along with a port number. format-network-address converts that to the string "[a:b:c:d:e:f:g:h]:p".

If the vector does not include the port number, p, or if omit-port is non-nil, the result does not include the :p suffix.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.19 Communicating with Serial Ports

Emacs can communicate with serial ports. For interactive use, M-x serial-term opens a terminal window. In a Lisp program, make-serial-process creates a process object.

The serial port can be configured at run-time, without having to close and re-open it. The function serial-process-configure lets you change the speed, bytesize, and other parameters. In a terminal window created by serial-term, you can click on the mode line for configuration.

A serial connection is represented by a process object, which can be used in a similar way to a subprocess or network process. You can send and receive data, and configure the serial port. A serial process object has no process ID, however, and you can’t send signals to it, and the status codes are different from other types of processes. delete-process on the process object or kill-buffer on the process buffer close the connection, but this does not affect the device connected to the serial port.

The function process-type returns the symbol serial for a process object representing a serial port connection.

Serial ports are available on GNU/Linux, Unix, and MS Windows systems.

Command: serial-term port speed

Start a terminal-emulator for a serial port in a new buffer. port is the name of the serial port to connect to. For example, this could be /dev/ttyS0 on Unix. On MS Windows, this could be COM1, or \\.\COM10 (double the backslashes in Lisp strings).

speed is the speed of the serial port in bits per second. 9600 is a common value. The buffer is in Term mode; see Term Mode in The GNU Emacs Manual, for the commands to use in that buffer. You can change the speed and the configuration in the mode line menu.

Function: make-serial-process &rest args

This function creates a process and a buffer. Arguments are specified as keyword/argument pairs. Here’s the list of the meaningful keywords, with the first two (port and speed) being mandatory:

:port port

This is the name of the serial port. On Unix and GNU systems, this is a file name such as /dev/ttyS0. On Windows, this could be COM1, or \\.\COM10 for ports higher than COM9 (double the backslashes in Lisp strings).

:speed speed

The speed of the serial port in bits per second. This function calls serial-process-configure to handle the speed; see the following documentation of that function for more details.

:name name

The name of the process. If name is not given, port will serve as the process name as well.

:buffer buffer

The buffer to associate with the process. The value can be either a buffer or a string that names a buffer. Process output goes at the end of that buffer, unless you specify an output stream or filter function to handle the output. If buffer is not given, the process buffer’s name is taken from the value of the :name keyword.

:coding coding

If coding is a symbol, it specifies the coding system used for both reading and writing for this process. If coding is a cons (decoding . encoding), decoding is used for reading, and encoding is used for writing. If not specified, the default is to determine the coding systems from the data itself.

:noquery query-flag

Initialize the process query flag to query-flag. See section Querying Before Exit. The flags defaults to nil if unspecified.

:stop bool

Start process in the “stopped” state if bool is non-nil. In the stopped state, a serial process does not accept incoming data, but you can send outgoing data. The stopped state is cleared by continue-process and set by stop-process.

:filter filter

Install filter as the process filter.

:sentinel sentinel

Install sentinel as the process sentinel.

:plist plist

Install plist as the initial plist of the process.

:bytesize
:parity
:stopbits
:flowcontrol

These are handled by serial-process-configure, which is called by make-serial-process.

The original argument list, possibly modified by later configuration, is available via the function process-contact.

Here is an example:

(make-serial-process :port "/dev/ttyS0" :speed 9600)
Function: serial-process-configure &rest args

This function configures a serial port connection. Arguments are specified as keyword/argument pairs. Attributes that are not given are re-initialized from the process’s current configuration (available via the function process-contact), or set to reasonable default values. The following arguments are defined:

:process process
:name name
:buffer buffer
:port port

Any of these arguments can be given to identify the process that is to be configured. If none of these arguments is given, the current buffer’s process is used.

:speed speed

The speed of the serial port in bits per second, a.k.a. baud rate. The value can be any number, but most serial ports work only at a few defined values between 1200 and 115200, with 9600 being the most common value. If speed is nil, the function ignores all other arguments and does not configure the port. This may be useful for special serial ports such as Bluetooth-to-serial converters, which can only be configured through ‘AT’ commands sent through the connection. The value of nil for speed is valid only for connections that were already opened by a previous call to make-serial-process or serial-term.

:bytesize bytesize

The number of bits per byte, which can be 7 or 8. If bytesize is not given or nil, it defaults to 8.

:parity parity

The value can be nil (don’t use parity), the symbol odd (use odd parity), or the symbol even (use even parity). If parity is not given, it defaults to no parity.

:stopbits stopbits

The number of stopbits used to terminate a transmission of each byte. stopbits can be 1 or 2. If stopbits is not given or nil, it defaults to 1.

:flowcontrol flowcontrol

The type of flow control to use for this connection, which is either nil (don’t use flow control), the symbol hw (use RTS/CTS hardware flow control), or the symbol sw (use XON/XOFF software flow control). If flowcontrol is not given, it defaults to no flow control.

Internally, make-serial-process calls serial-process-configure for the initial configuration of the serial port.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.20 Packing and Unpacking Byte Arrays

This section describes how to pack and unpack arrays of bytes, usually for binary network protocols. These functions convert byte arrays to alists, and vice versa. The byte array can be represented as a unibyte string or as a vector of integers, while the alist associates symbols either with fixed-size objects or with recursive sub-alists. To use the functions referred to in this section, load the bindat library.

Conversion from byte arrays to nested alists is also known as deserializing or unpacking, while going in the opposite direction is also known as serializing or packing.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.20.1 Describing Data Layout

To control unpacking and packing, you write a data layout specification, a special nested list describing named and typed fields. This specification controls the length of each field to be processed, and how to pack or unpack it. We normally keep bindat specs in variables whose names end in ‘-bindat-spec’; that kind of name is automatically recognized as “risky”.

A field’s type describes the size (in bytes) of the object that the field represents and, in the case of multibyte fields, how the bytes are ordered within the field. The two possible orderings are “big endian” (also known as “network byte ordering”) and “little endian”. For instance, the number #x23cd (decimal 9165) in big endian would be the two bytes #x23 #xcd; and in little endian, #xcd #x23. Here are the possible type values:

u8
byte

Unsigned byte, with length 1.

u16
word
short

Unsigned integer in network byte order, with length 2.

u24

Unsigned integer in network byte order, with length 3.

u32
dword
long

Unsigned integer in network byte order, with length 4. Note: These values may be limited by Emacs’s integer implementation limits.

u16r
u24r
u32r

Unsigned integer in little endian order, with length 2, 3 and 4, respectively.

str len

String of length len.

strz len

Zero-terminated string, in a fixed-size field with length len.

vec len [type]

Vector of len elements of type type, defaulting to bytes. The type is any of the simple types above, or another vector specified as a list of the form (vec len [type]).

ip

Four-byte vector representing an Internet address. For example: [127 0 0 1] for localhost.

bits len

List of set bits in len bytes. The bytes are taken in big endian order and the bits are numbered starting with 8 * len - 1 and ending with zero. For example: bits 2 unpacks #x28 #x1c to (2 3 4 11 13) and #x1c #x28 to (3 5 10 11 12).

(eval form)

form is a Lisp expression evaluated at the moment the field is unpacked or packed. The result of the evaluation should be one of the above-listed type specifications.

For a fixed-size field, the length len is given as an integer specifying the number of bytes in the field.

When the length of a field is not fixed, it typically depends on the value of a preceding field. In this case, the length len can be given either as a list (name ...) identifying a field name in the format specified for bindat-get-field below, or by an expression (eval form) where form should evaluate to an integer, specifying the field length.

A field specification generally has the form ([name] handler), where name is optional. Don’t use names that are symbols meaningful as type specifications (above) or handler specifications (below), since that would be ambiguous. name can be a symbol or an expression (eval form), in which case form should evaluate to a symbol.

handler describes how to unpack or pack the field and can be one of the following:

type

Unpack/pack this field according to the type specification type.

eval form

Evaluate form, a Lisp expression, for side-effect only. If the field name is specified, the value is bound to that field name.

fill len

Skip len bytes. In packing, this leaves them unchanged, which normally means they remain zero. In unpacking, this means they are ignored.

align len

Skip to the next multiple of len bytes.

struct spec-name

Process spec-name as a sub-specification. This describes a structure nested within another structure.

union form (tag spec)…

Evaluate form, a Lisp expression, find the first tag that matches it, and process its associated data layout specification spec. Matching can occur in one of three ways:

repeat count field-specs

Process the field-specs recursively, in order, then repeat starting from the first one, processing all the specifications count times overall. The count is given using the same formats as a field length—if an eval form is used, it is evaluated just once. For correct operation, each specification in field-specs must include a name.

For the (eval form) forms used in a bindat specification, the form can access and update these dynamically bound variables during evaluation:

last

Value of the last field processed.

bindat-raw

The data as a byte array.

bindat-idx

Current index (within bindat-raw) for unpacking or packing.

struct

The alist containing the structured data that have been unpacked so far, or the entire structure being packed. You can use bindat-get-field to access specific fields of this structure.

count
index

Inside a repeat block, these contain the maximum number of repetitions (as specified by the count parameter), and the current repetition number (counting from 0). Setting count to zero will terminate the inner-most repeat block after the current repetition has completed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.20.2 Functions to Unpack and Pack Bytes

In the following documentation, spec refers to a data layout specification, bindat-raw to a byte array, and struct to an alist representing unpacked field data.

Function: bindat-unpack spec bindat-raw &optional bindat-idx

This function unpacks data from the unibyte string or byte array bindat-raw according to spec. Normally, this starts unpacking at the beginning of the byte array, but if bindat-idx is non-nil, it specifies a zero-based starting position to use instead.

The value is an alist or nested alist in which each element describes one unpacked field.

Function: bindat-get-field struct &rest name

This function selects a field’s data from the nested alist struct. Usually struct was returned by bindat-unpack. If name corresponds to just one argument, that means to extract a top-level field value. Multiple name arguments specify repeated lookup of sub-structures. An integer name acts as an array index.

For example, if name is (a b 2 c), that means to find field c in the third element of subfield b of field a. (This corresponds to struct.a.b[2].c in C.)

Although packing and unpacking operations change the organization of data (in memory), they preserve the data’s total length, which is the sum of all the fields’ lengths, in bytes. This value is not generally inherent in either the specification or alist alone; instead, both pieces of information contribute to its calculation. Likewise, the length of a string or array being unpacked may be longer than the data’s total length as described by the specification.

Function: bindat-length spec struct

This function returns the total length of the data in struct, according to spec.

Function: bindat-pack spec struct &optional bindat-raw bindat-idx

This function returns a byte array packed according to spec from the data in the alist struct. It normally creates and fills a new byte array starting at the beginning. However, if bindat-raw is non-nil, it specifies a pre-allocated unibyte string or vector to pack into. If bindat-idx is non-nil, it specifies the starting offset for packing into bindat-raw.

When pre-allocating, you should make sure (length bindat-raw) meets or exceeds the total length to avoid an out-of-range error.

Function: bindat-ip-to-string ip

Convert the Internet address vector ip to a string in the usual dotted notation.

(bindat-ip-to-string [127 0 0 1])
     ⇒ "127.0.0.1"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.20.3 Examples of Byte Unpacking and Packing

Here is a complete example of byte unpacking and packing:

(require 'bindat)

(defvar fcookie-index-spec
  '((:version  u32)
    (:count    u32)
    (:longest  u32)
    (:shortest u32)
    (:flags    u32)
    (:delim    u8)
    (:ignored  fill 3)
    (:offset   repeat (:count) (:foo u32)))
  "Description of a fortune cookie index file's contents.")

(defun fcookie (cookies &optional index)
  "Display a random fortune cookie from file COOKIES.
Optional second arg INDEX specifies the associated index
filename, by default \"COOKIES.dat\".  Display cookie text
in buffer \"*Fortune Cookie: BASENAME*\", where BASENAME
is COOKIES without the directory part."
  (interactive "fCookies file: ")
  (let* ((info (with-temp-buffer
                 (insert-file-contents-literally
                  (or index (concat cookies ".dat")))
                 (bindat-unpack fcookie-index-spec
                                (buffer-string))))
         (sel (random (bindat-get-field info :count)))
         (beg (cdar (bindat-get-field info :offset sel)))
         (end (or (cdar (bindat-get-field info
                                          :offset (1+ sel)))
                  (nth 7 (file-attributes cookies)))))
    (switch-to-buffer
     (get-buffer-create
      (format "*Fortune Cookie: %s*"
              (file-name-nondirectory cookies))))
    (erase-buffer)
    (insert-file-contents-literally
     cookies nil beg (- end 3))))

(defun fcookie-create-index (cookies &optional index delim)
  "Scan file COOKIES, and write out its index file.
Optional arg INDEX specifies the index filename, which by
default is \"COOKIES.dat\".  Optional arg DELIM specifies the
unibyte character that, when found on a line of its own in
COOKIES, indicates the border between entries."
  (interactive "fCookies file: ")
  (setq delim (or delim ?%))
  (let ((delim-line (format "\n%c\n" delim))
        (count 0)
        (max 0)
        min p q len offsets)
    (unless (= 3 (string-bytes delim-line))
      (error "Delimiter cannot be represented in one byte"))
    (with-temp-buffer
      (insert-file-contents-literally cookies)
      (while (and (setq p (point))
                  (search-forward delim-line (point-max) t)
                  (setq len (- (point) 3 p)))
        (setq count (1+ count)
              max (max max len)
              min (min (or min max) len)
              offsets (cons (1- p) offsets))))
    (with-temp-buffer
      (set-buffer-multibyte nil)
      (insert
       (bindat-pack
        fcookie-index-spec
        `((:version . 2)
          (:count . ,count)
          (:longest . ,max)
          (:shortest . ,min)
          (:flags . 0)
          (:delim . ,delim)
          (:offset . ,(mapcar (lambda (o)
                                (list (cons :foo o)))
                              (nreverse offsets))))))
      (let ((coding-system-for-write 'raw-text-unix))
        (write-file (or index (concat cookies ".dat")))))))

The following is an example of defining and unpacking a complex structure. Consider the following C structures:

struct header {
    unsigned long    dest_ip;
    unsigned long    src_ip;
    unsigned short   dest_port;
    unsigned short   src_port;
};

struct data {
    unsigned char    type;
    unsigned char    opcode;
    unsigned short   length;  /* in network byte order  */
    unsigned char    id[8];   /* null-terminated string  */
    unsigned char    data[/* (length + 3) & ~3 */];
};

struct packet {
    struct header    header;
    unsigned long    counters[2];  /* in little endian order  */
    unsigned char    items;
    unsigned char    filler[3];
    struct data      item[/* items */];

};

The corresponding data layout specification is:

(setq header-spec
      '((dest-ip   ip)
        (src-ip    ip)
        (dest-port u16)
        (src-port  u16)))

(setq data-spec
      '((type      u8)
        (opcode    u8)
        (length    u16)  ; network byte order
        (id        strz 8)
        (data      vec (length))
        (align     4)))

(setq packet-spec
      '((header    struct header-spec)
        (counters  vec 2 u32r)   ; little endian order
        (items     u8)
        (fill      3)
        (item      repeat (items)
                   (struct data-spec))))

A binary data representation is:

(setq binary-data
      [ 192 168 1 100 192 168 1 101 01 28 21 32
        160 134 1 0 5 1 0 0 2 0 0 0
        2 3 0 5 ?A ?B ?C ?D ?E ?F 0 0 1 2 3 4 5 0 0 0
        1 4 0 7 ?B ?C ?D ?E ?F ?G 0 0 6 7 8 9 10 11 12 0 ])

The corresponding decoded structure is:

(setq decoded (bindat-unpack packet-spec binary-data))
     ⇒
((header
  (dest-ip   . [192 168 1 100])
  (src-ip    . [192 168 1 101])
  (dest-port . 284)
  (src-port  . 5408))
 (counters . [100000 261])
 (items . 2)
 (item ((data . [1 2 3 4 5])
        (id . "ABCDEF")
        (length . 5)
        (opcode . 3)
        (type . 2))
       ((data . [6 7 8 9 10 11 12])
        (id . "BCDEFG")
        (length . 7)
        (opcode . 4)
        (type . 1))))

An example of fetching data from this structure:

(bindat-get-field decoded 'item 1 'id)
     ⇒ "BCDEFG"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37 Emacs Display

This chapter describes a number of features related to the display that Emacs presents to the user.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.1 Refreshing the Screen

The function redraw-frame clears and redisplays the entire contents of a given frame (see section Frames). This is useful if the screen is corrupted.

Function: redraw-frame frame

This function clears and redisplays frame frame.

Even more powerful is redraw-display:

Command: redraw-display

This function clears and redisplays all visible frames.

In Emacs, processing user input takes priority over redisplay. If you call these functions when input is available, they don’t redisplay immediately, but the requested redisplay does happen eventually—after all the input has been processed.

On text terminals, suspending and resuming Emacs normally also refreshes the screen. Some terminal emulators record separate contents for display-oriented programs such as Emacs and for ordinary sequential display. If you are using such a terminal, you might want to inhibit the redisplay on resumption.

User Option: no-redraw-on-reenter

This variable controls whether Emacs redraws the entire screen after it has been suspended and resumed. Non-nil means there is no need to redraw, nil means redrawing is needed. The default is nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.2 Forcing Redisplay

Emacs normally tries to redisplay the screen whenever it waits for input. With the following function, you can request an immediate attempt to redisplay, in the middle of Lisp code, without actually waiting for input.

Function: redisplay &optional force

This function tries immediately to redisplay. The optional argument force, if non-nil, forces the redisplay to be performed, instead of being preempted if input is pending.

The function returns t if it actually tried to redisplay, and nil otherwise. A value of t does not mean that redisplay proceeded to completion; it could have been preempted by newly arriving input.

Variable: pre-redisplay-function

A function run just before redisplay. It is called with one argument, the set of windows to redisplay.

Although redisplay tries immediately to redisplay, it does not change how Emacs decides which parts of its frame(s) to redisplay. By contrast, the following function adds certain windows to the pending redisplay work (as if their contents had completely changed), but does not immediately try to perform redisplay.

Function: force-window-update &optional object

This function forces some or all windows to be updated the next time Emacs does a redisplay. If object is a window, that window is to be updated. If object is a buffer or buffer name, all windows displaying that buffer are to be updated. If object is nil (or omitted), all windows are to be updated.

This function does not do a redisplay immediately; Emacs does that as it waits for input, or when the function redisplay is called.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.3 Truncation

When a line of text extends beyond the right edge of a window, Emacs can continue the line (make it “wrap” to the next screen line), or truncate the line (limit it to one screen line). The additional screen lines used to display a long text line are called continuation lines. Continuation is not the same as filling; continuation happens on the screen only, not in the buffer contents, and it breaks a line precisely at the right margin, not at a word boundary. See section Filling.

On a graphical display, tiny arrow images in the window fringes indicate truncated and continued lines (see section Fringes). On a text terminal, a ‘$’ in the rightmost column of the window indicates truncation; a ‘\’ on the rightmost column indicates a line that “wraps”. (The display table can specify alternate characters to use for this; see section Display Tables).

User Option: truncate-lines

If this buffer-local variable is non-nil, lines that extend beyond the right edge of the window are truncated; otherwise, they are continued. As a special exception, the variable truncate-partial-width-windows takes precedence in partial-width windows (i.e., windows that do not occupy the entire frame width).

User Option: truncate-partial-width-windows

This variable controls line truncation in partial-width windows. A partial-width window is one that does not occupy the entire frame width (see section Splitting Windows). If the value is nil, line truncation is determined by the variable truncate-lines (see above). If the value is an integer n, lines are truncated if the partial-width window has fewer than n columns, regardless of the value of truncate-lines; if the partial-width window has n or more columns, line truncation is determined by truncate-lines. For any other non-nil value, lines are truncated in every partial-width window, regardless of the value of truncate-lines.

When horizontal scrolling (see section Horizontal Scrolling) is in use in a window, that forces truncation.

Variable: wrap-prefix

If this buffer-local variable is non-nil, it defines a wrap prefix which Emacs displays at the start of every continuation line. (If lines are truncated, wrap-prefix is never used.) Its value may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the :width or :align-to display properties (see section Specified Spaces). The value is interpreted in the same way as a display text property. See section The display Property.

A wrap prefix may also be specified for regions of text, using the wrap-prefix text or overlay property. This takes precedence over the wrap-prefix variable. See section Properties with Special Meanings.

Variable: line-prefix

If this buffer-local variable is non-nil, it defines a line prefix which Emacs displays at the start of every non-continuation line. Its value may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the :width or :align-to display properties (see section Specified Spaces). The value is interpreted in the same way as a display text property. See section The display Property.

A line prefix may also be specified for regions of text using the line-prefix text or overlay property. This takes precedence over the line-prefix variable. See section Properties with Special Meanings.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4 The Echo Area

The echo area is used for displaying error messages (see section Errors), for messages made with the message primitive, and for echoing keystrokes. It is not the same as the minibuffer, despite the fact that the minibuffer appears (when active) in the same place on the screen as the echo area. See The Minibuffer in The GNU Emacs Manual.

Apart from the functions documented in this section, you can print Lisp objects to the echo area by specifying t as the output stream. See section Output Streams.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4.1 Displaying Messages in the Echo Area

This section describes the standard functions for displaying messages in the echo area.

Function: message format-string &rest arguments

This function displays a message in the echo area. format-string is a format string, and arguments are the objects for its format specifications, like in the format function (see section Formatting Strings). The resulting formatted string is displayed in the echo area; if it contains face text properties, it is displayed with the specified faces (see section Faces). The string is also added to the *Messages* buffer, but without text properties (see section Logging Messages in *Messages*).

In batch mode, the message is printed to the standard error stream, followed by a newline.

If format-string is nil or the empty string, message clears the echo area; if the echo area has been expanded automatically, this brings it back to its normal size. If the minibuffer is active, this brings the minibuffer contents back onto the screen immediately.

(message "Minibuffer depth is %d."
         (minibuffer-depth))
 -| Minibuffer depth is 0.
⇒ "Minibuffer depth is 0."
---------- Echo Area ----------
Minibuffer depth is 0.
---------- Echo Area ----------

To automatically display a message in the echo area or in a pop-buffer, depending on its size, use display-message-or-buffer (see below).

Macro: with-temp-message message &rest body

This construct displays a message in the echo area temporarily, during the execution of body. It displays message, executes body, then returns the value of the last body form while restoring the previous echo area contents.

Function: message-or-box format-string &rest arguments

This function displays a message like message, but may display it in a dialog box instead of the echo area. If this function is called in a command that was invoked using the mouse—more precisely, if last-nonmenu-event (see section Information from the Command Loop) is either nil or a list—then it uses a dialog box or pop-up menu to display the message. Otherwise, it uses the echo area. (This is the same criterion that y-or-n-p uses to make a similar decision; see Yes-or-No Queries.)

You can force use of the mouse or of the echo area by binding last-nonmenu-event to a suitable value around the call.

Function: message-box format-string &rest arguments

This function displays a message like message, but uses a dialog box (or a pop-up menu) whenever that is possible. If it is impossible to use a dialog box or pop-up menu, because the terminal does not support them, then message-box uses the echo area, like message.

Function: display-message-or-buffer message &optional buffer-name not-this-window frame

This function displays the message message, which may be either a string or a buffer. If it is shorter than the maximum height of the echo area, as defined by max-mini-window-height, it is displayed in the echo area, using message. Otherwise, display-buffer is used to show it in a pop-up buffer.

Returns either the string shown in the echo area, or when a pop-up buffer is used, the window used to display it.

If message is a string, then the optional argument buffer-name is the name of the buffer used to display it when a pop-up buffer is used, defaulting to *Message*. In the case where message is a string and displayed in the echo area, it is not specified whether the contents are inserted into the buffer anyway.

The optional arguments not-this-window and frame are as for display-buffer, and only used if a buffer is displayed.

Function: current-message

This function returns the message currently being displayed in the echo area, or nil if there is none.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4.2 Reporting Operation Progress

When an operation can take a while to finish, you should inform the user about the progress it makes. This way the user can estimate remaining time and clearly see that Emacs is busy working, not hung. A convenient way to do this is to use a progress reporter.

Here is a working example that does nothing useful:

(let ((progress-reporter
       (make-progress-reporter "Collecting mana for Emacs..."
                               0  500)))
  (dotimes (k 500)
    (sit-for 0.01)
    (progress-reporter-update progress-reporter k))
  (progress-reporter-done progress-reporter))
Function: make-progress-reporter message &optional min-value max-value current-value min-change min-time

This function creates and returns a progress reporter object, which you will use as an argument for the other functions listed below. The idea is to precompute as much data as possible to make progress reporting very fast.

When this progress reporter is subsequently used, it will display message in the echo area, followed by progress percentage. message is treated as a simple string. If you need it to depend on a filename, for instance, use format before calling this function.

The arguments min-value and max-value should be numbers standing for the starting and final states of the operation. For instance, an operation that “scans” a buffer should set these to the results of point-min and point-max correspondingly. max-value should be greater than min-value.

Alternatively, you can set min-value and max-value to nil. In that case, the progress reporter does not report process percentages; it instead displays a “spinner” that rotates a notch each time you update the progress reporter.

If min-value and max-value are numbers, you can give the argument current-value a numerical value specifying the initial progress; if omitted, this defaults to min-value.

The remaining arguments control the rate of echo area updates. The progress reporter will wait for at least min-change more percents of the operation to be completed before printing next message; the default is one percent. min-time specifies the minimum time in seconds to pass between successive prints; the default is 0.2 seconds. (On some operating systems, the progress reporter may handle fractions of seconds with varying precision).

This function calls progress-reporter-update, so the first message is printed immediately.

Function: progress-reporter-update reporter &optional value

This function does the main work of reporting progress of your operation. It displays the message of reporter, followed by progress percentage determined by value. If percentage is zero, or close enough according to the min-change and min-time arguments, then it is omitted from the output.

reporter must be the result of a call to make-progress-reporter. value specifies the current state of your operation and must be between min-value and max-value (inclusive) as passed to make-progress-reporter. For instance, if you scan a buffer, then value should be the result of a call to point.

This function respects min-change and min-time as passed to make-progress-reporter and so does not output new messages on every invocation. It is thus very fast and normally you should not try to reduce the number of calls to it: resulting overhead will most likely negate your effort.

Function: progress-reporter-force-update reporter &optional value new-message

This function is similar to progress-reporter-update except that it prints a message in the echo area unconditionally.

The first two arguments have the same meaning as for progress-reporter-update. Optional new-message allows you to change the message of the reporter. Since this function always updates the echo area, such a change will be immediately presented to the user.

Function: progress-reporter-done reporter

This function should be called when the operation is finished. It prints the message of reporter followed by word “done” in the echo area.

You should always call this function and not hope for progress-reporter-update to print “100%”. Firstly, it may never print it, there are many good reasons for this not to happen. Secondly, “done” is more explicit.

Macro: dotimes-with-progress-reporter (var count [result]) message body…

This is a convenience macro that works the same way as dotimes does, but also reports loop progress using the functions described above. It allows you to save some typing.

You can rewrite the example in the beginning of this node using this macro this way:

(dotimes-with-progress-reporter
    (k 500)
    "Collecting some mana for Emacs..."
  (sit-for 0.01))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4.3 Logging Messages in *Messages*

Almost all the messages displayed in the echo area are also recorded in the *Messages* buffer so that the user can refer back to them. This includes all the messages that are output with message. By default, this buffer is read-only and uses the major mode messages-buffer-mode. Nothing prevents the user from killing the *Messages* buffer, but the next display of a message recreates it. Any Lisp code that needs to access the *Messages* buffer directly and wants to ensure that it exists should use the function messages-buffer.

Function: messages-buffer

This function returns the *Messages* buffer. If it does not exist, it creates it, and switches it to messages-buffer-mode.

User Option: message-log-max

This variable specifies how many lines to keep in the *Messages* buffer. The value t means there is no limit on how many lines to keep. The value nil disables message logging entirely. Here’s how to display a message and prevent it from being logged:

(let (message-log-max)
  (message …))

To make *Messages* more convenient for the user, the logging facility combines successive identical messages. It also combines successive related messages for the sake of two cases: question followed by answer, and a series of progress messages.

A “question followed by an answer” means two messages like the ones produced by y-or-n-p: the first is ‘question’, and the second is ‘question...answer’. The first message conveys no additional information beyond what’s in the second, so logging the second message discards the first from the log.

A “series of progress messages” means successive messages like those produced by make-progress-reporter. They have the form ‘base...how-far’, where base is the same each time, while how-far varies. Logging each message in the series discards the previous one, provided they are consecutive.

The functions make-progress-reporter and y-or-n-p don’t have to do anything special to activate the message log combination feature. It operates whenever two consecutive messages are logged that share a common prefix ending in ‘...’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4.4 Echo Area Customization

These variables control details of how the echo area works.

Variable: cursor-in-echo-area

This variable controls where the cursor appears when a message is displayed in the echo area. If it is non-nil, then the cursor appears at the end of the message. Otherwise, the cursor appears at point—not in the echo area at all.

The value is normally nil; Lisp programs bind it to t for brief periods of time.

Variable: echo-area-clear-hook

This normal hook is run whenever the echo area is cleared—either by (message nil) or for any other reason.

User Option: echo-keystrokes

This variable determines how much time should elapse before command characters echo. Its value must be a number, and specifies the number of seconds to wait before echoing. If the user types a prefix key (such as C-x) and then delays this many seconds before continuing, the prefix key is echoed in the echo area. (Once echoing begins in a key sequence, all subsequent characters in the same key sequence are echoed immediately.)

If the value is zero, then command input is not echoed.

Variable: message-truncate-lines

Normally, displaying a long message resizes the echo area to display the entire message. But if the variable message-truncate-lines is non-nil, the echo area does not resize, and the message is truncated to fit it.

The variable max-mini-window-height, which specifies the maximum height for resizing minibuffer windows, also applies to the echo area (which is really a special use of the minibuffer window; see section Minibuffer Miscellany).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5 Reporting Warnings

Warnings are a facility for a program to inform the user of a possible problem, but continue running.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5.1 Warning Basics

Every warning has a textual message, which explains the problem for the user, and a severity level which is a symbol. Here are the possible severity levels, in order of decreasing severity, and their meanings:

:emergency

A problem that will seriously impair Emacs operation soon if you do not attend to it promptly.

:error

A report of data or circumstances that are inherently wrong.

:warning

A report of data or circumstances that are not inherently wrong, but raise suspicion of a possible problem.

:debug

A report of information that may be useful if you are debugging.

When your program encounters invalid input data, it can either signal a Lisp error by calling error or signal or report a warning with severity :error. Signaling a Lisp error is the easiest thing to do, but it means the program cannot continue processing. If you want to take the trouble to implement a way to continue processing despite the bad data, then reporting a warning of severity :error is the right way to inform the user of the problem. For instance, the Emacs Lisp byte compiler can report an error that way and continue compiling other functions. (If the program signals a Lisp error and then handles it with condition-case, the user won’t see the error message; it could show the message to the user by reporting it as a warning.)

Each warning has a warning type to classify it. The type is a list of symbols. The first symbol should be the custom group that you use for the program’s user options. For example, byte compiler warnings use the warning type (bytecomp). You can also subcategorize the warnings, if you wish, by using more symbols in the list.

Function: display-warning type message &optional level buffer-name

This function reports a warning, using message as the message and type as the warning type. level should be the severity level, with :warning being the default.

buffer-name, if non-nil, specifies the name of the buffer for logging the warning. By default, it is *Warnings*.

Function: lwarn type level message &rest args

This function reports a warning using the value of (format message args...) as the message in the *Warnings* buffer. In other respects it is equivalent to display-warning.

Function: warn message &rest args

This function reports a warning using the value of (format message args...) as the message, (emacs) as the type, and :warning as the severity level. It exists for compatibility only; we recommend not using it, because you should specify a specific warning type.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5.2 Warning Variables

Programs can customize how their warnings appear by binding the variables described in this section.

Variable: warning-levels

This list defines the meaning and severity order of the warning severity levels. Each element defines one severity level, and they are arranged in order of decreasing severity.

Each element has the form (level string function), where level is the severity level it defines. string specifies the textual description of this level. string should use ‘%s’ to specify where to put the warning type information, or it can omit the ‘%s’ so as not to include that information.

The optional function, if non-nil, is a function to call with no arguments, to get the user’s attention.

Normally you should not change the value of this variable.

Variable: warning-prefix-function

If non-nil, the value is a function to generate prefix text for warnings. Programs can bind the variable to a suitable function. display-warning calls this function with the warnings buffer current, and the function can insert text in it. That text becomes the beginning of the warning message.

The function is called with two arguments, the severity level and its entry in warning-levels. It should return a list to use as the entry (this value need not be an actual member of warning-levels). By constructing this value, the function can change the severity of the warning, or specify different handling for a given severity level.

If the variable’s value is nil then there is no function to call.

Variable: warning-series

Programs can bind this variable to t to say that the next warning should begin a series. When several warnings form a series, that means to leave point on the first warning of the series, rather than keep moving it for each warning so that it appears on the last one. The series ends when the local binding is unbound and warning-series becomes nil again.

The value can also be a symbol with a function definition. That is equivalent to t, except that the next warning will also call the function with no arguments with the warnings buffer current. The function can insert text which will serve as a header for the series of warnings.

Once a series has begun, the value is a marker which points to the buffer position in the warnings buffer of the start of the series.

The variable’s normal value is nil, which means to handle each warning separately.

Variable: warning-fill-prefix

When this variable is non-nil, it specifies a fill prefix to use for filling each warning’s text.

Variable: warning-type-format

This variable specifies the format for displaying the warning type in the warning message. The result of formatting the type this way gets included in the message under the control of the string in the entry in warning-levels. The default value is " (%s)". If you bind it to "" then the warning type won’t appear at all.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5.3 Warning Options

These variables are used by users to control what happens when a Lisp program reports a warning.

User Option: warning-minimum-level

This user option specifies the minimum severity level that should be shown immediately to the user. The default is :warning, which means to immediately display all warnings except :debug warnings.

User Option: warning-minimum-log-level

This user option specifies the minimum severity level that should be logged in the warnings buffer. The default is :warning, which means to log all warnings except :debug warnings.

User Option: warning-suppress-types

This list specifies which warning types should not be displayed immediately for the user. Each element of the list should be a list of symbols. If its elements match the first elements in a warning type, then that warning is not displayed immediately.

User Option: warning-suppress-log-types

This list specifies which warning types should not be logged in the warnings buffer. Each element of the list should be a list of symbols. If it matches the first few elements in a warning type, then that warning is not logged.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5.4 Delayed Warnings

Sometimes, you may wish to avoid showing a warning while a command is running, and only show it only after the end of the command. You can use the variable delayed-warnings-list for this.

Variable: delayed-warnings-list

The value of this variable is a list of warnings to be displayed after the current command has finished. Each element must be a list

(type message [level [buffer-name]])

with the same form, and the same meanings, as the argument list of display-warning (see section Warning Basics). Immediately after running post-command-hook (see section Command Loop Overview), the Emacs command loop displays all the warnings specified by this variable, then resets it to nil.

Programs which need to further customize the delayed warnings mechanism can change the variable delayed-warnings-hook:

Variable: delayed-warnings-hook

This is a normal hook which is run by the Emacs command loop, after post-command-hook, in order to to process and display delayed warnings.

Its default value is a list of two functions:

(collapse-delayed-warnings display-delayed-warnings)

The function collapse-delayed-warnings removes repeated entries from delayed-warnings-list. The function display-delayed-warnings calls display-warning on each of the entries in delayed-warnings-list, in turn, and then sets delayed-warnings-list to nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.6 Invisible Text

You can make characters invisible, so that they do not appear on the screen, with the invisible property. This can be either a text property (see section Text Properties) or an overlay property (see section Overlays). Cursor motion also partly ignores these characters; if the command loop finds that point is inside a range of invisible text after a command, it relocates point to the other side of the text.

In the simplest case, any non-nil invisible property makes a character invisible. This is the default case—if you don’t alter the default value of buffer-invisibility-spec, this is how the invisible property works. You should normally use t as the value of the invisible property if you don’t plan to set buffer-invisibility-spec yourself.

More generally, you can use the variable buffer-invisibility-spec to control which values of the invisible property make text invisible. This permits you to classify the text into different subsets in advance, by giving them different invisible values, and subsequently make various subsets visible or invisible by changing the value of buffer-invisibility-spec.

Controlling visibility with buffer-invisibility-spec is especially useful in a program to display the list of entries in a database. It permits the implementation of convenient filtering commands to view just a part of the entries in the database. Setting this variable is very fast, much faster than scanning all the text in the buffer looking for properties to change.

Variable: buffer-invisibility-spec

This variable specifies which kinds of invisible properties actually make a character invisible. Setting this variable makes it buffer-local.

t

A character is invisible if its invisible property is non-nil. This is the default.

a list

Each element of the list specifies a criterion for invisibility; if a character’s invisible property fits any one of these criteria, the character is invisible. The list can have two kinds of elements:

atom

A character is invisible if its invisible property value is atom or if it is a list with atom as a member; comparison is done with eq.

(atom . t)

A character is invisible if its invisible property value is atom or if it is a list with atom as a member; comparison is done with eq. Moreover, a sequence of such characters displays as an ellipsis.

Two functions are specifically provided for adding elements to buffer-invisibility-spec and removing elements from it.

Function: add-to-invisibility-spec element

This function adds the element element to buffer-invisibility-spec. If buffer-invisibility-spec was t, it changes to a list, (t), so that text whose invisible property is t remains invisible.

Function: remove-from-invisibility-spec element

This removes the element element from buffer-invisibility-spec. This does nothing if element is not in the list.

A convention for use of buffer-invisibility-spec is that a major mode should use the mode’s own name as an element of buffer-invisibility-spec and as the value of the invisible property:

;; If you want to display an ellipsis:
(add-to-invisibility-spec '(my-symbol . t))
;; If you don’t want ellipsis:
(add-to-invisibility-spec 'my-symbol)

(overlay-put (make-overlay beginning end)
             'invisible 'my-symbol)

;; When done with the invisibility:
(remove-from-invisibility-spec '(my-symbol . t))
;; Or respectively:
(remove-from-invisibility-spec 'my-symbol)

You can check for invisibility using the following function:

Function: invisible-p pos-or-prop

If pos-or-prop is a marker or number, this function returns a non-nil value if the text at that position is invisible.

If pos-or-prop is any other kind of Lisp object, that is taken to mean a possible value of the invisible text or overlay property. In that case, this function returns a non-nil value if that value would cause text to become invisible, based on the current value of buffer-invisibility-spec.

Ordinarily, functions that operate on text or move point do not care whether the text is invisible, they process invisible characters and visible characters alike. The user-level line motion commands, such as next-line, previous-line, ignore invisible newlines if line-move-ignore-invisible is non-nil (the default), i.e., behave like these invisible newlines didn’t exist in the buffer, but only because they are explicitly programmed to do so.

If a command ends with point inside or at the boundary of invisible text, the main editing loop relocates point to one of the two ends of the invisible text. Emacs chooses the direction of relocation so that it is the same as the overall movement direction of the command; if in doubt, it prefers a position where an inserted char would not inherit the invisible property. Additionally, if the text is not replaced by an ellipsis and the command only moved within the invisible text, then point is moved one extra character so as to try and reflect the command’s movement by a visible movement of the cursor.

Thus, if the command moved point back to an invisible range (with the usual stickiness), Emacs moves point back to the beginning of that range. If the command moved point forward into an invisible range, Emacs moves point forward to the first visible character that follows the invisible text and then forward one more character.

These adjustments of point that ended up in the middle of invisible text can be disabled by setting disable-point-adjustment to a non-nil value. See section Adjusting Point After Commands.

Incremental search can make invisible overlays visible temporarily and/or permanently when a match includes invisible text. To enable this, the overlay should have a non-nil isearch-open-invisible property. The property value should be a function to be called with the overlay as an argument. This function should make the overlay visible permanently; it is used when the match overlaps the overlay on exit from the search.

During the search, such overlays are made temporarily visible by temporarily modifying their invisible and intangible properties. If you want this to be done differently for a certain overlay, give it an isearch-open-invisible-temporary property which is a function. The function is called with two arguments: the first is the overlay, and the second is nil to make the overlay visible, or t to make it invisible again.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.7 Selective Display

Selective display refers to a pair of related features for hiding certain lines on the screen.

The first variant, explicit selective display, was designed for use in a Lisp program: it controls which lines are hidden by altering the text. This kind of hiding is now obsolete; instead you can get the same effect with the invisible property (see section Invisible Text).

In the second variant, the choice of lines to hide is made automatically based on indentation. This variant is designed to be a user-level feature.

The way you control explicit selective display is by replacing a newline (control-j) with a carriage return (control-m). The text that was formerly a line following that newline is now hidden. Strictly speaking, it is temporarily no longer a line at all, since only newlines can separate lines; it is now part of the previous line.

Selective display does not directly affect editing commands. For example, C-f (forward-char) moves point unhesitatingly into hidden text. However, the replacement of newline characters with carriage return characters affects some editing commands. For example, next-line skips hidden lines, since it searches only for newlines. Modes that use selective display can also define commands that take account of the newlines, or that control which parts of the text are hidden.

When you write a selectively displayed buffer into a file, all the control-m’s are output as newlines. This means that when you next read in the file, it looks OK, with nothing hidden. The selective display effect is seen only within Emacs.

Variable: selective-display

This buffer-local variable enables selective display. This means that lines, or portions of lines, may be made hidden.

When some portion of a buffer is hidden, the vertical movement commands operate as if that portion did not exist, allowing a single next-line command to skip any number of hidden lines. However, character movement commands (such as forward-char) do not skip the hidden portion, and it is possible (if tricky) to insert or delete text in an hidden portion.

In the examples below, we show the display appearance of the buffer foo, which changes with the value of selective-display. The contents of the buffer do not change.

(setq selective-display nil)
     ⇒ nil

---------- Buffer: foo ----------
1 on this column
 2on this column
  3n this column
  3n this column
 2on this column
1 on this column
---------- Buffer: foo ----------
(setq selective-display 2)
     ⇒ 2

---------- Buffer: foo ----------
1 on this column
 2on this column
 2on this column
1 on this column
---------- Buffer: foo ----------
User Option: selective-display-ellipses

If this buffer-local variable is non-nil, then Emacs displays ‘’ at the end of a line that is followed by hidden text. This example is a continuation of the previous one.

(setq selective-display-ellipses t)
     ⇒ t

---------- Buffer: foo ----------
1 on this column
 2on this column ...
 2on this column
1 on this column
---------- Buffer: foo ----------

You can use a display table to substitute other text for the ellipsis (‘’). See section Display Tables.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.8 Temporary Displays

Temporary displays are used by Lisp programs to put output into a buffer and then present it to the user for perusal rather than for editing. Many help commands use this feature.

Macro: with-output-to-temp-buffer buffer-name body…

This function executes the forms in body while arranging to insert any output they print into the buffer named buffer-name, which is first created if necessary, and put into Help mode. (See the similar form with-temp-buffer-window below.) Finally, the buffer is displayed in some window, but that window is not selected.

If the forms in body do not change the major mode in the output buffer, so that it is still Help mode at the end of their execution, then with-output-to-temp-buffer makes this buffer read-only at the end, and also scans it for function and variable names to make them into clickable cross-references. See Tips for Documentation Strings, in particular the item on hyperlinks in documentation strings, for more details.

The string buffer-name specifies the temporary buffer, which need not already exist. The argument must be a string, not a buffer. The buffer is erased initially (with no questions asked), and it is marked as unmodified after with-output-to-temp-buffer exits.

with-output-to-temp-buffer binds standard-output to the temporary buffer, then it evaluates the forms in body. Output using the Lisp output functions within body goes by default to that buffer (but screen display and messages in the echo area, although they are “output” in the general sense of the word, are not affected). See section Output Functions.

Several hooks are available for customizing the behavior of this construct; they are listed below.

The value of the last form in body is returned.

---------- Buffer: foo ----------
 This is the contents of foo.
---------- Buffer: foo ----------
(with-output-to-temp-buffer "foo"
    (print 20)
    (print standard-output))
⇒ #<buffer foo>

---------- Buffer: foo ----------

20

#<buffer foo>

---------- Buffer: foo ----------
User Option: temp-buffer-show-function

If this variable is non-nil, with-output-to-temp-buffer calls it as a function to do the job of displaying a help buffer. The function gets one argument, which is the buffer it should display.

It is a good idea for this function to run temp-buffer-show-hook just as with-output-to-temp-buffer normally would, inside of save-selected-window and with the chosen window and buffer selected.

Variable: temp-buffer-setup-hook

This normal hook is run by with-output-to-temp-buffer before evaluating body. When the hook runs, the temporary buffer is current. This hook is normally set up with a function to put the buffer in Help mode.

Variable: temp-buffer-show-hook

This normal hook is run by with-output-to-temp-buffer after displaying the temporary buffer. When the hook runs, the temporary buffer is current, and the window it was displayed in is selected.

Macro: with-temp-buffer-window buffer-or-name action quit-function body…

This macro is similar to with-output-to-temp-buffer. Like that construct, it executes body while arranging to insert any output it prints into the buffer named buffer-or-name and displays that buffer in some window. Unlike with-output-to-temp-buffer, however, it does not automatically switch that buffer to Help mode.

Like with-output-to-temp-buffer it neither makes the buffer specified by buffer-or-name current when executing body. The otherwise identical macro with-current-buffer-window can be used to execute body with that buffer current.

The argument buffer-or-name specifies the temporary buffer. It can be either a buffer, which must already exist, or a string, in which case a buffer of that name is created, if necessary. The buffer is marked as unmodified and read-only when with-temp-buffer-window exits.

This macro does not call temp-buffer-show-function. Rather, it passes the action argument to display-buffer in order to display the buffer.

The value of the last form in body is returned, unless the argument quit-function is specified. In that case, it is called with two arguments: the window showing the buffer and the result of body. The final return value is then whatever quit-function returns.

This macro uses the normal hooks temp-buffer-window-setup-hook and temp-buffer-window-show-hook in place of the analogous hooks run by with-output-to-temp-buffer.

Function: momentary-string-display string position &optional char message

This function momentarily displays string in the current buffer at position. It has no effect on the undo list or on the buffer’s modification status.

The momentary display remains until the next input event. If the next input event is char, momentary-string-display ignores it and returns. Otherwise, that event remains buffered for subsequent use as input. Thus, typing char will simply remove the string from the display, while typing (say) C-f will remove the string from the display and later (presumably) move point forward. The argument char is a space by default.

The return value of momentary-string-display is not meaningful.

If the string string does not contain control characters, you can do the same job in a more general way by creating (and then subsequently deleting) an overlay with a before-string property. See section Overlay Properties.

If message is non-nil, it is displayed in the echo area while string is displayed in the buffer. If it is nil, a default message says to type char to continue.

In this example, point is initially located at the beginning of the second line:

---------- Buffer: foo ----------
This is the contents of foo.
∗Second line.
---------- Buffer: foo ----------
(momentary-string-display
  "**** Important Message! ****"
  (point) ?\r
  "Type RET when done reading")
⇒ t
---------- Buffer: foo ----------
This is the contents of foo.
**** Important Message! ****Second line.
---------- Buffer: foo ----------

---------- Echo Area ----------
Type RET when done reading
---------- Echo Area ----------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.9 Overlays

You can use overlays to alter the appearance of a buffer’s text on the screen, for the sake of presentation features. An overlay is an object that belongs to a particular buffer, and has a specified beginning and end. It also has properties that you can examine and set; these affect the display of the text within the overlay.

The visual effect of an overlay is the same as of the corresponding text property (see section Text Properties). However, due to a different implementation, overlays generally don’t scale well (many operations take a time that is proportional to the number of overlays in the buffer). If you need to affect the visual appearance of many portions in the buffer, we recommend using text properties.

An overlay uses markers to record its beginning and end; thus, editing the text of the buffer adjusts the beginning and end of each overlay so that it stays with the text. When you create the overlay, you can specify whether text inserted at the beginning should be inside the overlay or outside, and likewise for the end of the overlay.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.9.1 Managing Overlays

This section describes the functions to create, delete and move overlays, and to examine their contents. Overlay changes are not recorded in the buffer’s undo list, since the overlays are not part of the buffer’s contents.

Function: overlayp object

This function returns t if object is an overlay.

Function: make-overlay start end &optional buffer front-advance rear-advance

This function creates and returns an overlay that belongs to buffer and ranges from start to end. Both start and end must specify buffer positions; they may be integers or markers. If buffer is omitted, the overlay is created in the current buffer.

The arguments front-advance and rear-advance specify the marker insertion type for the start of the overlay and for the end of the overlay, respectively. See section Marker Insertion Types. If they are both nil, the default, then the overlay extends to include any text inserted at the beginning, but not text inserted at the end. If front-advance is non-nil, text inserted at the beginning of the overlay is excluded from the overlay. If rear-advance is non-nil, text inserted at the end of the overlay is included in the overlay.

Function: overlay-start overlay

This function returns the position at which overlay starts, as an integer.

Function: overlay-end overlay

This function returns the position at which overlay ends, as an integer.

Function: overlay-buffer overlay

This function returns the buffer that overlay belongs to. It returns nil if overlay has been deleted.

Function: delete-overlay overlay

This function deletes overlay. The overlay continues to exist as a Lisp object, and its property list is unchanged, but it ceases to be attached to the buffer it belonged to, and ceases to have any effect on display.

A deleted overlay is not permanently disconnected. You can give it a position in a buffer again by calling move-overlay.

Function: move-overlay overlay start end &optional buffer

This function moves overlay to buffer, and places its bounds at start and end. Both arguments start and end must specify buffer positions; they may be integers or markers.

If buffer is omitted, overlay stays in the same buffer it was already associated with; if overlay was deleted, it goes into the current buffer.

The return value is overlay.

This is the only valid way to change the endpoints of an overlay. Do not try modifying the markers in the overlay by hand, as that fails to update other vital data structures and can cause some overlays to be “lost”.

Function: remove-overlays &optional start end name value

This function removes all the overlays between start and end whose property name has the value value. It can move the endpoints of the overlays in the region, or split them.

If name is omitted or nil, it means to delete all overlays in the specified region. If start and/or end are omitted or nil, that means the beginning and end of the buffer respectively. Therefore, (remove-overlays) removes all the overlays in the current buffer.

Function: copy-overlay overlay

This function returns a copy of overlay. The copy has the same endpoints and properties as overlay. However, the marker insertion type for the start of the overlay and for the end of the overlay are set to their default values (see section Marker Insertion Types).

Here are some examples:

;; Create an overlay.
(setq foo (make-overlay 1 10))
     ⇒ #<overlay from 1 to 10 in display.texi>
(overlay-start foo)
     ⇒ 1
(overlay-end foo)
     ⇒ 10
(overlay-buffer foo)
     ⇒ #<buffer display.texi>
;; Give it a property we can check later.
(overlay-put foo 'happy t)
     ⇒ t
;; Verify the property is present.
(overlay-get foo 'happy)
     ⇒ t
;; Move the overlay.
(move-overlay foo 5 20)
     ⇒ #<overlay from 5 to 20 in display.texi>
(overlay-start foo)
     ⇒ 5
(overlay-end foo)
     ⇒ 20
;; Delete the overlay.
(delete-overlay foo)
     ⇒ nil
;; Verify it is deleted.
foo
     ⇒ #<overlay in no buffer>
;; A deleted overlay has no position.
(overlay-start foo)
     ⇒ nil
(overlay-end foo)
     ⇒ nil
(overlay-buffer foo)
     ⇒ nil
;; Undelete the overlay.
(move-overlay foo 1 20)
     ⇒ #<overlay from 1 to 20 in display.texi>
;; Verify the results.
(overlay-start foo)
     ⇒ 1
(overlay-end foo)
     ⇒ 20
(overlay-buffer foo)
     ⇒ #<buffer display.texi>
;; Moving and deleting the overlay does not change its properties.
(overlay-get foo 'happy)
     ⇒ t

Emacs stores the overlays of each buffer in two lists, divided around an arbitrary “center position”. One list extends backwards through the buffer from that center position, and the other extends forwards from that center position. The center position can be anywhere in the buffer.

Function: overlay-recenter pos

This function recenters the overlays of the current buffer around position pos. That makes overlay lookup faster for positions near pos, but slower for positions far away from pos.

A loop that scans the buffer forwards, creating overlays, can run faster if you do (overlay-recenter (point-max)) first.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.9.2 Overlay Properties

Overlay properties are like text properties in that the properties that alter how a character is displayed can come from either source. But in most respects they are different. See section Text Properties, for comparison.

Text properties are considered a part of the text; overlays and their properties are specifically considered not to be part of the text. Thus, copying text between various buffers and strings preserves text properties, but does not try to preserve overlays. Changing a buffer’s text properties marks the buffer as modified, while moving an overlay or changing its properties does not. Unlike text property changes, overlay property changes are not recorded in the buffer’s undo list.

Since more than one overlay can specify a property value for the same character, Emacs lets you specify a priority value of each overlay. In case two overlays have the same priority value, and one is nested in the other, then the inner one will have priority over the outer one. If neither is nested in the other then you should not make assumptions about which overlay will prevail.

These functions read and set the properties of an overlay:

Function: overlay-get overlay prop

This function returns the value of property prop recorded in overlay, if any. If overlay does not record any value for that property, but it does have a category property which is a symbol, that symbol’s prop property is used. Otherwise, the value is nil.

Function: overlay-put overlay prop value

This function sets the value of property prop recorded in overlay to value. It returns value.

Function: overlay-properties overlay

This returns a copy of the property list of overlay.

See also the function get-char-property which checks both overlay properties and text properties for a given character. See section Examining Text Properties.

Many overlay properties have special meanings; here is a table of them:

priority

This property’s value determines the priority of the overlay. If you want to specify a priority value, use either nil (or zero), or a positive integer. Any other value has undefined behavior.

The priority matters when two or more overlays cover the same character and both specify the same property; the one whose priority value is larger overrides the other. For the face property, the higher priority overlay’s value does not completely override the other value; instead, its face attributes override the face attributes of the lower priority face property.

Currently, all overlays take priority over text properties.

Note that Emacs sometimes uses non-numeric priority values for some of its internal overlays, so do not try to do arithmetic on the priority of an overlay (unless it is one that you created). If you need to put overlays in priority order, use the sorted argument of overlays-at. See section Searching for Overlays.

window

If the window property is non-nil, then the overlay applies only on that window.

category

If an overlay has a category property, we call it the category of the overlay. It should be a symbol. The properties of the symbol serve as defaults for the properties of the overlay.

face

This property controls the appearance of the text (see section Faces). The value of the property can be the following:

mouse-face

This property is used instead of face when the mouse is within the range of the overlay. However, Emacs ignores all face attributes from this property that alter the text size (e.g., :height, :weight, and :slant). Those attributes are always the same as in the unhighlighted text.

display

This property activates various features that change the way text is displayed. For example, it can make text appear taller or shorter, higher or lower, wider or narrower, or replaced with an image. See section The display Property.

help-echo

If an overlay has a help-echo property, then when you move the mouse onto the text in the overlay, Emacs displays a help string in the echo area, or in the tooltip window. For details see Text help-echo.

field

Consecutive characters with the same field property constitute a field. Some motion functions including forward-word and beginning-of-line stop moving at a field boundary. See section Defining and Using Fields.

modification-hooks

This property’s value is a list of functions to be called if any character within the overlay is changed or if text is inserted strictly within the overlay.

The hook functions are called both before and after each change. If the functions save the information they receive, and compare notes between calls, they can determine exactly what change has been made in the buffer text.

When called before a change, each function receives four arguments: the overlay, nil, and the beginning and end of the text range to be modified.

When called after a change, each function receives five arguments: the overlay, t, the beginning and end of the text range just modified, and the length of the pre-change text replaced by that range. (For an insertion, the pre-change length is zero; for a deletion, that length is the number of characters deleted, and the post-change beginning and end are equal.)

If these functions modify the buffer, they should bind inhibit-modification-hooks to t around doing so, to avoid confusing the internal mechanism that calls these hooks.

Text properties also support the modification-hooks property, but the details are somewhat different (see section Properties with Special Meanings).

insert-in-front-hooks

This property’s value is a list of functions to be called before and after inserting text right at the beginning of the overlay. The calling conventions are the same as for the modification-hooks functions.

insert-behind-hooks

This property’s value is a list of functions to be called before and after inserting text right at the end of the overlay. The calling conventions are the same as for the modification-hooks functions.

invisible

The invisible property can make the text in the overlay invisible, which means that it does not appear on the screen. See section Invisible Text, for details.

intangible

The intangible property on an overlay works just like the intangible text property. See section Properties with Special Meanings, for details.

isearch-open-invisible

This property tells incremental search how to make an invisible overlay visible, permanently, if the final match overlaps it. See section Invisible Text.

isearch-open-invisible-temporary

This property tells incremental search how to make an invisible overlay visible, temporarily, during the search. See section Invisible Text.

before-string

This property’s value is a string to add to the display at the beginning of the overlay. The string does not appear in the buffer in any sense—only on the screen.

after-string

This property’s value is a string to add to the display at the end of the overlay. The string does not appear in the buffer in any sense—only on the screen.

line-prefix

This property specifies a display spec to prepend to each non-continuation line at display-time. See section Truncation.

wrap-prefix

This property specifies a display spec to prepend to each continuation line at display-time. See section Truncation.

evaporate

If this property is non-nil, the overlay is deleted automatically if it becomes empty (i.e., if its length becomes zero). If you give an empty overlay a non-nil evaporate property, that deletes it immediately.

keymap

If this property is non-nil, it specifies a keymap for a portion of the text. This keymap is used when the character after point is within the overlay, and takes precedence over most other keymaps. See section Active Keymaps.

local-map

The local-map property is similar to keymap but replaces the buffer’s local map rather than augmenting existing keymaps. This also means it has lower precedence than minor mode keymaps.

The keymap and local-map properties do not affect a string displayed by the before-string, after-string, or display properties. This is only relevant for mouse clicks and other mouse events that fall on the string, since point is never on the string. To bind special mouse events for the string, assign it a keymap or local-map text property. See section Properties with Special Meanings.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.9.3 Searching for Overlays

Function: overlays-at pos &optional sorted

This function returns a list of all the overlays that cover the character at position pos in the current buffer. If sorted is non-nil, the list is in decreasing order of priority, otherwise it is in no particular order. An overlay contains position pos if it begins at or before pos, and ends after pos.

To illustrate usage, here is a Lisp function that returns a list of the overlays that specify property prop for the character at point:

(defun find-overlays-specifying (prop)
  (let ((overlays (overlays-at (point)))
        found)
    (while overlays
      (let ((overlay (car overlays)))
        (if (overlay-get overlay prop)
            (setq found (cons overlay found))))
      (setq overlays (cdr overlays)))
    found))
Function: overlays-in beg end

This function returns a list of the overlays that overlap the region beg through end. “Overlap” means that at least one character is contained within the overlay and also contained within the specified region; however, empty overlays are included in the result if they are located at beg, strictly between beg and end, or at end when end denotes the position at the end of the buffer.

Function: next-overlay-change pos

This function returns the buffer position of the next beginning or end of an overlay, after pos. If there is none, it returns (point-max).

Function: previous-overlay-change pos

This function returns the buffer position of the previous beginning or end of an overlay, before pos. If there is none, it returns (point-min).

As an example, here’s a simplified (and inefficient) version of the primitive function next-single-char-property-change (see section Text Property Search Functions). It searches forward from position pos for the next position where the value of a given property prop, as obtained from either overlays or text properties, changes.

(defun next-single-char-property-change (position prop)
  (save-excursion
    (goto-char position)
    (let ((propval (get-char-property (point) prop)))
      (while (and (not (eobp))
                  (eq (get-char-property (point) prop) propval))
        (goto-char (min (next-overlay-change (point))
                        (next-single-property-change (point) prop)))))
    (point)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.10 Size of Displayed Text

Since not all characters have the same width, these functions let you check the width of a character. See section Indentation Primitives, and Motion by Screen Lines, for related functions.

Function: char-width char

This function returns the width in columns of the character char, if it were displayed in the current buffer (i.e., taking into account the buffer’s display table, if any; see section Display Tables). The width of a tab character is usually tab-width (see section Usual Display Conventions).

Function: string-width string

This function returns the width in columns of the string string, if it were displayed in the current buffer and the selected window.

Function: truncate-string-to-width string width &optional start-column padding ellipsis

This function returns the part of string that fits within width columns, as a new string.

If string does not reach width, then the result ends where string ends. If one multi-column character in string extends across the column width, that character is not included in the result. Thus, the result can fall short of width but cannot go beyond it.

The optional argument start-column specifies the starting column. If this is non-nil, then the first start-column columns of the string are omitted from the value. If one multi-column character in string extends across the column start-column, that character is not included.

The optional argument padding, if non-nil, is a padding character added at the beginning and end of the result string, to extend it to exactly width columns. The padding character is used at the end of the result if it falls short of width. It is also used at the beginning of the result if one multi-column character in string extends across the column start-column.

If ellipsis is non-nil, it should be a string which will replace the end of string (including any padding) if it extends beyond width, unless the display width of string is equal to or less than the display width of ellipsis. If ellipsis is non-nil and not a string, it stands for "...".

(truncate-string-to-width "\tab\t" 12 4)
     ⇒ "ab"
(truncate-string-to-width "\tab\t" 12 4 ?\s)
     ⇒ "    ab  "

The following function returns the size in pixels of text as if it were displayed in a given window. This function is used by fit-window-to-buffer (see section Resizing Windows) and fit-frame-to-buffer (see section Frame Size And Position) to make a window exactly as large as the text it contains.

Function: window-text-pixel-size &optional window from to x-limit y-limit mode-and-header-line

This function returns the size of the text of window’s buffer in pixels. window must be a live window and defaults to the selected one. The return value is a cons of the maximum pixel-width of any text line and the maximum pixel-height of all text lines.

The optional argument from, if non-nil, specifies the first text position to consider and defaults to the minimum accessible position of the buffer. If from is t, it uses the minimum accessible position that is not a newline character. The optional argument to, if non-nil, specifies the last text position to consider and defaults to the maximum accessible position of the buffer. If to is t, it uses the maximum accessible position that is not a newline character.

The optional argument x-limit, if non-nil, specifies the maximum pixel-width that can be returned. x-limit nil or omitted, means to use the pixel-width of window’s body (see section Window Sizes); this is useful when the caller does not intend to change the width of window. Otherwise, the caller should specify here the maximum width window’s body may assume. Text whose x-coordinate is beyond x-limit is ignored. Since calculating the width of long lines can take some time, it’s always a good idea to make this argument as small as needed; in particular, if the buffer might contain long lines that will be truncated anyway.

The optional argument y-limit, if non-nil, specifies the maximum pixel-height that can be returned. Text lines whose y-coordinate is beyond y-limit are ignored. Since calculating the pixel-height of a large buffer can take some time, it makes sense to specify this argument; in particular, if the caller does not know the size of the buffer.

The optional argument mode-and-header-line nil or omitted means to not include the height of the mode- or header-line of window in the return value. If it is either the symbol mode-line or header-line, include only the height of that line, if present, in the return value. If it is t, include the height of both, if present, in the return value.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.11 Line Height

The total height of each display line consists of the height of the contents of the line, plus optional additional vertical line spacing above or below the display line.

The height of the line contents is the maximum height of any character or image on that display line, including the final newline if there is one. (A display line that is continued doesn’t include a final newline.) That is the default line height, if you do nothing to specify a greater height. (In the most common case, this equals the height of the default frame font.)

There are several ways to explicitly specify a larger line height, either by specifying an absolute height for the display line, or by specifying vertical space. However, no matter what you specify, the actual line height can never be less than the default.

A newline can have a line-height text or overlay property that controls the total height of the display line ending in that newline.

If the property value is t, the newline character has no effect on the displayed height of the line—the visible contents alone determine the height. This is useful for tiling small images (or image slices) without adding blank areas between the images.

If the property value is a list of the form (height total), that adds extra space below the display line. First Emacs uses height as a height spec to control extra space above the line; then it adds enough space below the line to bring the total line height up to total. In this case, the other ways to specify the line spacing are ignored.

Any other kind of property value is a height spec, which translates into a number—the specified line height. There are several ways to write a height spec; here’s how each of them translates into a number:

integer

If the height spec is a positive integer, the height value is that integer.

float

If the height spec is a float, float, the numeric height value is float times the frame’s default line height.

(face . ratio)

If the height spec is a cons of the format shown, the numeric height is ratio times the height of face face. ratio can be any type of number, or nil which means a ratio of 1. If face is t, it refers to the current face.

(nil . ratio)

If the height spec is a cons of the format shown, the numeric height is ratio times the height of the contents of the line.

Thus, any valid height spec determines the height in pixels, one way or another. If the line contents’ height is less than that, Emacs adds extra vertical space above the line to achieve the specified total height.

If you don’t specify the line-height property, the line’s height consists of the contents’ height plus the line spacing. There are several ways to specify the line spacing for different parts of Emacs text.

On graphical terminals, you can specify the line spacing for all lines in a frame, using the line-spacing frame parameter (see section Layout Parameters). However, if the default value of line-spacing is non-nil, it overrides the frame’s line-spacing parameter. An integer specifies the number of pixels put below lines. A floating-point number specifies the spacing relative to the frame’s default line height.

You can specify the line spacing for all lines in a buffer via the buffer-local line-spacing variable. An integer specifies the number of pixels put below lines. A floating-point number specifies the spacing relative to the default frame line height. This overrides line spacings specified for the frame.

Finally, a newline can have a line-spacing text or overlay property that overrides the default frame line spacing and the buffer local line-spacing variable, for the display line ending in that newline.

One way or another, these mechanisms specify a Lisp value for the spacing of each line. The value is a height spec, and it translates into a Lisp value as described above. However, in this case the numeric height value specifies the line spacing, rather than the line height.

On text terminals, the line spacing cannot be altered.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12 Faces

A face is a collection of graphical attributes for displaying text: font, foreground color, background color, optional underlining, etc. Faces control how Emacs displays text in buffers, as well as other parts of the frame such as the mode line.

One way to represent a face is as a property list of attributes, like (:foreground "red" :weight bold). Such a list is called an anonymous face. For example, you can assign an anonymous face as the value of the face text property, and Emacs will display the underlying text with the specified attributes. See section Properties with Special Meanings.

More commonly, a face is referred to via a face name: a Lisp symbol associated with a set of face attributes19. Named faces are defined using the defface macro (see section Defining Faces). Emacs comes with several standard named faces (see section Basic Faces).

Many parts of Emacs required named faces, and do not accept anonymous faces. These include the functions documented in Face Attribute Functions, and the variable font-lock-keywords (see section Search-based Fontification). Unless otherwise stated, we will use the term face to refer only to named faces.

Function: facep object

This function returns a non-nil value if object is a named face: a Lisp symbol or string which serves as a face name. Otherwise, it returns nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.1 Face Attributes

Face attributes determine the visual appearance of a face. The following table lists all the face attributes, their possible values, and their effects.

Apart from the values given below, each face attribute can have the value unspecified. This special value means that the face doesn’t specify that attribute directly. An unspecified attribute tells Emacs to refer instead to a parent face (see the description :inherit attribute below); or, failing that, to an underlying face (see section Displaying Faces). The default face must specify all attributes.

Some of these attributes are meaningful only on certain kinds of displays. If your display cannot handle a certain attribute, the attribute is ignored.

:family

Font family or fontset (a string). See Fonts in The GNU Emacs Manual, for more information about font families. The function font-family-list (see below) returns a list of available family names. See section Fontsets, for information about fontsets.

:foundry

The name of the font foundry for the font family specified by the :family attribute (a string). See Fonts in The GNU Emacs Manual.

:width

Relative character width. This should be one of the symbols ultra-condensed, extra-condensed, condensed, semi-condensed, normal, semi-expanded, expanded, extra-expanded, or ultra-expanded.

:height

The height of the font. In the simplest case, this is an integer in units of 1/10 point.

The value can also be floating point or a function, which specifies the height relative to an underlying face (see section Displaying Faces). A floating-point value specifies the amount by which to scale the height of the underlying face. A function value is called with one argument, the height of the underlying face, and returns the height of the new face. If the function is passed an integer argument, it must return an integer.

The height of the default face must be specified using an integer; floating point and function values are not allowed.

:weight

Font weight—one of the symbols (from densest to faintest) ultra-bold, extra-bold, bold, semi-bold, normal, semi-light, light, extra-light, or ultra-light. On text terminals which support variable-brightness text, any weight greater than normal is displayed as extra bright, and any weight less than normal is displayed as half-bright.

:slant

Font slant—one of the symbols italic, oblique, normal, reverse-italic, or reverse-oblique. On text terminals that support variable-brightness text, slanted text is displayed as half-bright.

:foreground

Foreground color, a string. The value can be a system-defined color name, or a hexadecimal color specification. See section Color Names. On black-and-white displays, certain shades of gray are implemented by stipple patterns.

:distant-foreground

Alternative foreground color, a string. This is like :foreground but the color is only used as a foreground when the background color is near to the foreground that would have been used. This is useful for example when marking text (i.e. the region face). If the text has a foreground that is visible with the region face, that foreground is used. If the foreground is near the region face background, :distant-foreground is used instead so the text is readable.

:background

Background color, a string. The value can be a system-defined color name, or a hexadecimal color specification. See section Color Names.

:underline

Whether or not characters should be underlined, and in what way. The possible values of the :underline attribute are:

nil

Don’t underline.

t

Underline with the foreground color of the face.

color

Underline in color color, a string specifying a color.

(:color color :style style)

color is either a string, or the symbol foreground-color, meaning the foreground color of the face. Omitting the attribute :color means to use the foreground color of the face. style should be a symbol line or wave, meaning to use a straight or wavy line. Omitting the attribute :style means to use a straight line.

:overline

Whether or not characters should be overlined, and in what color. If the value is t, overlining uses the foreground color of the face. If the value is a string, overlining uses that color. The value nil means do not overline.

:strike-through

Whether or not characters should be strike-through, and in what color. The value is used like that of :overline.

:box

Whether or not a box should be drawn around characters, its color, the width of the box lines, and 3D appearance. Here are the possible values of the :box attribute, and what they mean:

nil

Don’t draw a box.

t

Draw a box with lines of width 1, in the foreground color.

color

Draw a box with lines of width 1, in color color.

(:line-width width :color color :style style)

This way you can explicitly specify all aspects of the box. The value width specifies the width of the lines to draw; it defaults to 1. A negative width -n means to draw a line of width n that occupies the space of the underlying text, thus avoiding any increase in the character height or width.

The value color specifies the color to draw with. The default is the foreground color of the face for simple boxes, and the background color of the face for 3D boxes.

The value style specifies whether to draw a 3D box. If it is released-button, the box looks like a 3D button that is not being pressed. If it is pressed-button, the box looks like a 3D button that is being pressed. If it is nil or omitted, a plain 2D box is used.

:inverse-video

Whether or not characters should be displayed in inverse video. The value should be t (yes) or nil (no).

:stipple

The background stipple, a bitmap.

The value can be a string; that should be the name of a file containing external-format X bitmap data. The file is found in the directories listed in the variable x-bitmap-file-path.

Alternatively, the value can specify the bitmap directly, with a list of the form (width height data). Here, width and height specify the size in pixels, and data is a string containing the raw bits of the bitmap, row by row. Each row occupies (width + 7) / 8 consecutive bytes in the string (which should be a unibyte string for best results). This means that each row always occupies at least one whole byte.

If the value is nil, that means use no stipple pattern.

Normally you do not need to set the stipple attribute, because it is used automatically to handle certain shades of gray.

:font

The font used to display the face. Its value should be a font object. See section Low-Level Font Representation, for information about font objects, font specs, and font entities.

When specifying this attribute using set-face-attribute (see section Face Attribute Functions), you may also supply a font spec, a font entity, or a string. Emacs converts such values to an appropriate font object, and stores that font object as the actual attribute value. If you specify a string, the contents of the string should be a font name (see Fonts in The GNU Emacs Manual); if the font name is an XLFD containing wildcards, Emacs chooses the first font matching those wildcards. Specifying this attribute also changes the values of the :family, :foundry, :width, :height, :weight, and :slant attributes.

:inherit

The name of a face from which to inherit attributes, or a list of face names. Attributes from inherited faces are merged into the face like an underlying face would be, with higher priority than underlying faces (see section Displaying Faces). If a list of faces is used, attributes from faces earlier in the list override those from later faces.

Function: font-family-list &optional frame

This function returns a list of available font family names. The optional argument frame specifies the frame on which the text is to be displayed; if it is nil, the selected frame is used.

User Option: underline-minimum-offset

This variable specifies the minimum distance between the baseline and the underline, in pixels, when displaying underlined text.

User Option: x-bitmap-file-path

This variable specifies a list of directories for searching for bitmap files, for the :stipple attribute.

Function: bitmap-spec-p object

This returns t if object is a valid bitmap specification, suitable for use with :stipple (see above). It returns nil otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.2 Defining Faces

The usual way to define a face is through the defface macro. This macro associates a face name (a symbol) with a default face spec. A face spec is a construct which specifies what attributes a face should have on any given terminal; for example, a face spec might specify one foreground color on high-color terminals, and a different foreground color on low-color terminals.

People are sometimes tempted to create a variable whose value is a face name. In the vast majority of cases, this is not necessary; the usual procedure is to define a face with defface, and then use its name directly.

Macro: defface face spec doc [keyword value]…

This macro declares face as a named face whose default face spec is given by spec. You should not quote the symbol face, and it should not end in ‘-face’ (that would be redundant). The argument doc is a documentation string for the face. The additional keyword arguments have the same meanings as in defgroup and defcustom (see section Common Item Keywords).

If face already has a default face spec, this macro does nothing.

The default face spec determines face’s appearance when no customizations are in effect (see section Customization Settings). If face has already been customized (via Custom themes or via customizations read from the init file), its appearance is determined by the custom face spec(s), which override the default face spec spec. However, if the customizations are subsequently removed, the appearance of face will again be determined by its default face spec.

As an exception, if you evaluate a defface form with C-M-x in Emacs Lisp mode (eval-defun), a special feature of eval-defun overrides any custom face specs on the face, causing the face to reflect exactly what the defface says.

The spec argument is a face spec, which states how the face should appear on different kinds of terminals. It should be an alist whose elements each have the form

(display . plist)

display specifies a class of terminals (see below). plist is a property list of face attributes and their values, specifying how the face appears on such terminals. For backward compatibility, you can also write an element as (display plist).

The display part of an element of spec determines which terminals the element matches. If more than one element of spec matches a given terminal, the first element that matches is the one used for that terminal. There are three possibilities for display:

default

This element of spec doesn’t match any terminal; instead, it specifies defaults that apply to all terminals. This element, if used, must be the first element of spec. Each of the following elements can override any or all of these defaults.

t

This element of spec matches all terminals. Therefore, any subsequent elements of spec are never used. Normally t is used in the last (or only) element of spec.

a list

If display is a list, each element should have the form (characteristic value…). Here characteristic specifies a way of classifying terminals, and the values are possible classifications which display should apply to. Here are the possible values of characteristic:

type

The kind of window system the terminal uses—either graphic (any graphics-capable display), x, pc (for the MS-DOS console), w32 (for MS Windows 9X/NT/2K/XP), or tty (a non-graphics-capable display). See section window-system.

class

What kinds of colors the terminal supports—either color, grayscale, or mono.

background

The kind of background—either light or dark.

min-colors

An integer that represents the minimum number of colors the terminal should support. This matches a terminal if its display-color-cells value is at least the specified integer.

supports

Whether or not the terminal can display the face attributes given in value… (see section Face Attributes). See Display Face Attribute Testing, for more information on exactly how this testing is done.

If an element of display specifies more than one value for a given characteristic, any of those values is acceptable. If display has more than one element, each element should specify a different characteristic; then each characteristic of the terminal must match one of the values specified for it in display.

For example, here’s the definition of the standard face highlight:

(defface highlight
  '((((class color) (min-colors 88) (background light))
     :background "darkseagreen2")
    (((class color) (min-colors 88) (background dark))
     :background "darkolivegreen")
    (((class color) (min-colors 16) (background light))
     :background "darkseagreen2")
    (((class color) (min-colors 16) (background dark))
     :background "darkolivegreen")
    (((class color) (min-colors 8))
     :background "green" :foreground "black")
    (t :inverse-video t))
  "Basic face for highlighting."
  :group 'basic-faces)

Internally, Emacs stores each face’s default spec in its face-defface-spec symbol property (see section Symbol Properties). The saved-face property stores any face spec saved by the user using the customization buffer; the customized-face property stores the face spec customized for the current session, but not saved; and the theme-face property stores an alist associating the active customization settings and Custom themes with the face specs for that face. The face’s documentation string is stored in the face-documentation property.

Normally, a face is declared just once, using defface, and any further changes to its appearance are applied using the Customize framework (e.g., via the Customize user interface or via the custom-set-faces function; see section Applying Customizations), or by face remapping (see section Face Remapping). In the rare event that you need to change a face spec directly from Lisp, you can use the face-spec-set function.

Function: face-spec-set face spec &optional spec-type

This function applies spec as a face spec for face. spec should be a face spec, as described in the above documentation for defface.

This function also defines face as a valid face name if it is not already one, and (re)calculates its attributes on existing frames.

The argument spec-type determines which spec to set. If it is nil or face-override-spec, this function sets the override spec, which overrides over all other face specs on face. If it is customized-face or saved-face, this function sets the customized spec or the saved custom spec. If it is face-defface-spec, this function sets the default face spec (the same one set by defface). If it is reset, this function clears out all customization specs and override specs from face (in this case, the value of spec is ignored). Any other value of spec-type is reserved for internal use.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.3 Face Attribute Functions

This section describes functions for directly accessing and modifying the attributes of a named face.

Function: face-attribute face attribute &optional frame inherit

This function returns the value of the attribute attribute for face on frame.

If frame is nil, that means the selected frame (see section Input Focus). If frame is t, this function returns the value of the specified attribute for newly-created frames (this is normally unspecified, unless you have specified some value using set-face-attribute; see below).

If inherit is nil, only attributes directly defined by face are considered, so the return value may be unspecified, or a relative value. If inherit is non-nil, face’s definition of attribute is merged with the faces specified by its :inherit attribute; however the return value may still be unspecified or relative. If inherit is a face or a list of faces, then the result is further merged with that face (or faces), until it becomes specified and absolute.

To ensure that the return value is always specified and absolute, use a value of default for inherit; this will resolve any unspecified or relative values by merging with the default face (which is always completely specified).

For example,

(face-attribute 'bold :weight)
     ⇒ bold
Function: face-attribute-relative-p attribute value

This function returns non-nil if value, when used as the value of the face attribute attribute, is relative. This means it would modify, rather than completely override, any value that comes from a subsequent face in the face list or that is inherited from another face.

unspecified is a relative value for all attributes. For :height, floating point and function values are also relative.

For example:

(face-attribute-relative-p :height 2.0)
     ⇒ t
Function: face-all-attributes face &optional frame

This function returns an alist of attributes of face. The elements of the result are name-value pairs of the form (attr-name . attr-value). Optional argument frame specifies the frame whose definition of face to return; if omitted or nil, the returned value describes the default attributes of face for newly created frames.

Function: merge-face-attribute attribute value1 value2

If value1 is a relative value for the face attribute attribute, returns it merged with the underlying value value2; otherwise, if value1 is an absolute value for the face attribute attribute, returns value1 unchanged.

Normally, Emacs uses the face specs of each face to automatically calculate its attributes on each frame (see section Defining Faces). The function set-face-attribute can override this calculation by directly assigning attributes to a face, either on a specific frame or for all frames. This function is mostly intended for internal usage.

Function: set-face-attribute face frame &rest arguments

This function sets one or more attributes of face for frame. The attributes specifies in this way override the face spec(s) belonging to face.

The extra arguments arguments specify the attributes to set, and the values for them. They should consist of alternating attribute names (such as :family or :underline) and values. Thus,

(set-face-attribute 'foo nil :weight 'bold :slant 'italic)

sets the attribute :weight to bold and the attribute :slant to italic.

If frame is t, this function sets the default attributes for newly created frames. If frame is nil, this function sets the attributes for all existing frames, as well as for newly created frames.

The following commands and functions mostly provide compatibility with old versions of Emacs. They work by calling set-face-attribute. Values of t and nil for their frame argument are handled just like set-face-attribute and face-attribute. The commands read their arguments using the minibuffer, if called interactively.

Command: set-face-foreground face color &optional frame
Command: set-face-background face color &optional frame

These set the :foreground attribute (or :background attribute, respectively) of face to color.

Command: set-face-stipple face pattern &optional frame

This sets the :stipple attribute of face to pattern.

Command: set-face-font face font &optional frame

This sets the :font attribute of face to font.

Function: set-face-bold face bold-p &optional frame

This sets the :weight attribute of face to normal if bold-p is nil, and to bold otherwise.

Function: set-face-italic face italic-p &optional frame

This sets the :slant attribute of face to normal if italic-p is nil, and to italic otherwise.

Function: set-face-underline face underline &optional frame

This sets the :underline attribute of face to underline.

Function: set-face-inverse-video face inverse-video-p &optional frame

This sets the :inverse-video attribute of face to inverse-video-p.

Command: invert-face face &optional frame

This swaps the foreground and background colors of face face.

The following functions examine the attributes of a face. They mostly provide compatibility with old versions of Emacs. If you don’t specify frame, they refer to the selected frame; t refers to the default data for new frames. They return unspecified if the face doesn’t define any value for that attribute. If inherit is nil, only an attribute directly defined by the face is returned. If inherit is non-nil, any faces specified by its :inherit attribute are considered as well, and if inherit is a face or a list of faces, then they are also considered, until a specified attribute is found. To ensure that the return value is always specified, use a value of default for inherit.

Function: face-font face &optional frame

This function returns the name of the font of face face.

Function: face-foreground face &optional frame inherit
Function: face-background face &optional frame inherit

These functions return the foreground color (or background color, respectively) of face face, as a string.

Function: face-stipple face &optional frame inherit

This function returns the name of the background stipple pattern of face face, or nil if it doesn’t have one.

Function: face-bold-p face &optional frame inherit

This function returns a non-nil value if the :weight attribute of face is bolder than normal (i.e., one of semi-bold, bold, extra-bold, or ultra-bold). Otherwise, it returns nil.

Function: face-italic-p face &optional frame inherit

This function returns a non-nil value if the :slant attribute of face is italic or oblique, and nil otherwise.

Function: face-underline-p face &optional frame inherit

This function returns non-nil if face face specifies a non-nil :underline attribute.

Function: face-inverse-video-p face &optional frame inherit

This function returns non-nil if face face specifies a non-nil :inverse-video attribute.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.4 Displaying Faces

When Emacs displays a given piece of text, the visual appearance of the text may be determined by faces drawn from different sources. If these various sources together specify more than one face for a particular character, Emacs merges the attributes of the various faces. Here is the order in which Emacs merges the faces, from highest to lowest priority:

At each stage, if a face has a valid :inherit attribute, Emacs treats any attribute with an unspecified value as having the corresponding value drawn from the parent face(s). see section Face Attributes. Note that the parent face(s) may also leave the attribute unspecified; in that case, the attribute remains unspecified at the next level of face merging.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.5 Face Remapping

The variable face-remapping-alist is used for buffer-local or global changes in the appearance of a face. For instance, it is used to implement the text-scale-adjust command (see Text Scale in The GNU Emacs Manual).

Variable: face-remapping-alist

The value of this variable is an alist whose elements have the form (face . remapping). This causes Emacs to display any text having the face face with remapping, rather than the ordinary definition of face.

remapping may be any face spec suitable for a face text property: either a face (i.e., a face name or a property list of attribute/value pairs), or a list of faces. For details, see the description of the face text property in Properties with Special Meanings. remapping serves as the complete specification for the remapped face—it replaces the normal definition of face, instead of modifying it.

If face-remapping-alist is buffer-local, its local value takes effect only within that buffer.

Note: face remapping is non-recursive. If remapping references the same face name face, either directly or via the :inherit attribute of some other face in remapping, that reference uses the normal definition of face. For instance, if the mode-line face is remapped using this entry in face-remapping-alist:

(mode-line italic mode-line)

then the new definition of the mode-line face inherits from the italic face, and the normal (non-remapped) definition of mode-line face.

The following functions implement a higher-level interface to face-remapping-alist. Most Lisp code should use these functions instead of setting face-remapping-alist directly, to avoid trampling on remappings applied elsewhere. These functions are intended for buffer-local remappings, so they all make face-remapping-alist buffer-local as a side-effect. They manage face-remapping-alist entries of the form

  (face relative-spec-1 relative-spec-2 ... base-spec)

where, as explained above, each of the relative-spec-N and base-spec is either a face name, or a property list of attribute/value pairs. Each of the relative remapping entries, relative-spec-N, is managed by the face-remap-add-relative and face-remap-remove-relative functions; these are intended for simple modifications like changing the text size. The base remapping entry, base-spec, has the lowest priority and is managed by the face-remap-set-base and face-remap-reset-base functions; it is intended for major modes to remap faces in the buffers they control.

Function: face-remap-add-relative face &rest specs

This function adds the face spec in specs as relative remappings for face face in the current buffer. The remaining arguments, specs, should form either a list of face names, or a property list of attribute/value pairs.

The return value is a Lisp object that serves as a “cookie”; you can pass this object as an argument to face-remap-remove-relative if you need to remove the remapping later.

;; Remap the `escape-glyph' face into a combination
;; of the `highlight' and `italic' faces:
(face-remap-add-relative 'escape-glyph 'highlight 'italic)

;; Increase the size of the `default' face by 50%:
(face-remap-add-relative 'default :height 1.5)
Function: face-remap-remove-relative cookie

This function removes a relative remapping previously added by face-remap-add-relative. cookie should be the Lisp object returned by face-remap-add-relative when the remapping was added.

Function: face-remap-set-base face &rest specs

This function sets the base remapping of face in the current buffer to specs. If specs is empty, the default base remapping is restored, similar to calling face-remap-reset-base (see below); note that this is different from specs containing a single value nil, which has the opposite result (the global definition of face is ignored).

This overwrites the default base-spec, which inherits the global face definition, so it is up to the caller to add such inheritance if so desired.

Function: face-remap-reset-base face

This function sets the base remapping of face to its default value, which inherits from face’s global definition.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.6 Functions for Working with Faces

Here are additional functions for creating and working with faces.

Function: face-list

This function returns a list of all defined face names.

Function: face-id face

This function returns the face number of face face. This is a number that uniquely identifies a face at low levels within Emacs. It is seldom necessary to refer to a face by its face number.

Function: face-documentation face

This function returns the documentation string of face face, or nil if none was specified for it.

Function: face-equal face1 face2 &optional frame

This returns t if the faces face1 and face2 have the same attributes for display.

Function: face-differs-from-default-p face &optional frame

This returns non-nil if the face face displays differently from the default face.

A face alias provides an equivalent name for a face. You can define a face alias by giving the alias symbol the face-alias property, with a value of the target face name. The following example makes modeline an alias for the mode-line face.

(put 'modeline 'face-alias 'mode-line)
Macro: define-obsolete-face-alias obsolete-face current-face when

This macro defines obsolete-face as an alias for current-face, and also marks it as obsolete, indicating that it may be removed in future. when should be a string indicating when obsolete-face was made obsolete (usually a version number string).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.7 Automatic Face Assignment

This hook is used for automatically assigning faces to text in the buffer. It is part of the implementation of Jit-Lock mode, used by Font-Lock.

Variable: fontification-functions

This variable holds a list of functions that are called by Emacs redisplay as needed, just before doing redisplay. They are called even when Font Lock Mode isn’t enabled. When Font Lock Mode is enabled, this variable usually holds just one function, jit-lock-function.

The functions are called in the order listed, with one argument, a buffer position pos. Collectively they should attempt to assign faces to the text in the current buffer starting at pos.

The functions should record the faces they assign by setting the face property. They should also add a non-nil fontified property to all the text they have assigned faces to. That property tells redisplay that faces have been assigned to that text already.

It is probably a good idea for the functions to do nothing if the character after pos already has a non-nil fontified property, but this is not required. If one function overrides the assignments made by a previous one, the properties after the last function finishes are the ones that really matter.

For efficiency, we recommend writing these functions so that they usually assign faces to around 400 to 600 characters at each call.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.8 Basic Faces

If your Emacs Lisp program needs to assign some faces to text, it is often a good idea to use certain existing faces or inherit from them, rather than defining entirely new faces. This way, if other users have customized the basic faces to give Emacs a certain look, your program will “fit in” without additional customization.

Some of the basic faces defined in Emacs are listed below. In addition to these, you might want to make use of the Font Lock faces for syntactic highlighting, if highlighting is not already handled by Font Lock mode, or if some Font Lock faces are not in use. See section Faces for Font Lock.

default

The default face, whose attributes are all specified. All other faces implicitly inherit from it: any unspecified attribute defaults to the attribute on this face (see section Face Attributes).

bold
italic
bold-italic
underline
fixed-pitch
variable-pitch

These have the attributes indicated by their names (e.g., bold has a bold :weight attribute), with all other attributes unspecified (and so given by default).

shadow

For “dimmed out” text. For example, it is used for the ignored part of a filename in the minibuffer (see Minibuffers for File Names in The GNU Emacs Manual).

link
link-visited

For clickable text buttons that send the user to a different buffer or “location”.

highlight

For stretches of text that should temporarily stand out. For example, it is commonly assigned to the mouse-face property for cursor highlighting (see section Properties with Special Meanings).

match

For text matching a search command.

error
warning
success

For text concerning errors, warnings, or successes. For example, these are used for messages in *Compilation* buffers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.9 Font Selection

Before Emacs can draw a character on a graphical display, it must select a font for that character20. See Fonts in The GNU Emacs Manual. Normally, Emacs automatically chooses a font based on the faces assigned to that character—specifically, the face attributes :family, :weight, :slant, and :width (see section Face Attributes). The choice of font also depends on the character to be displayed; some fonts can only display a limited set of characters. If no available font exactly fits the requirements, Emacs looks for the closest matching font. The variables in this section control how Emacs makes this selection.

User Option: face-font-family-alternatives

If a given family is specified but does not exist, this variable specifies alternative font families to try. Each element should have this form:

(family alternate-families…)

If family is specified but not available, Emacs will try the other families given in alternate-families, one by one, until it finds a family that does exist.

User Option: face-font-selection-order

If there is no font that exactly matches all desired face attributes (:width, :height, :weight, and :slant), this variable specifies the order in which these attributes should be considered when selecting the closest matching font. The value should be a list containing those four attribute symbols, in order of decreasing importance. The default is (:width :height :weight :slant).

Font selection first finds the best available matches for the first attribute in the list; then, among the fonts which are best in that way, it searches for the best matches in the second attribute, and so on.

The attributes :weight and :width have symbolic values in a range centered around normal. Matches that are more extreme (farther from normal) are somewhat preferred to matches that are less extreme (closer to normal); this is designed to ensure that non-normal faces contrast with normal ones, whenever possible.

One example of a case where this variable makes a difference is when the default font has no italic equivalent. With the default ordering, the italic face will use a non-italic font that is similar to the default one. But if you put :slant before :height, the italic face will use an italic font, even if its height is not quite right.

User Option: face-font-registry-alternatives

This variable lets you specify alternative font registries to try, if a given registry is specified and doesn’t exist. Each element should have this form:

(registry alternate-registries…)

If registry is specified but not available, Emacs will try the other registries given in alternate-registries, one by one, until it finds a registry that does exist.

Emacs can make use of scalable fonts, but by default it does not use them.

User Option: scalable-fonts-allowed

This variable controls which scalable fonts to use. A value of nil, the default, means do not use scalable fonts. t means to use any scalable font that seems appropriate for the text.

Otherwise, the value must be a list of regular expressions. Then a scalable font is enabled for use if its name matches any regular expression in the list. For example,

(setq scalable-fonts-allowed '("iso10646-1$"))

allows the use of scalable fonts with registry iso10646-1.

Variable: face-font-rescale-alist

This variable specifies scaling for certain faces. Its value should be a list of elements of the form

(fontname-regexp . scale-factor)

If fontname-regexp matches the font name that is about to be used, this says to choose a larger similar font according to the factor scale-factor. You would use this feature to normalize the font size if certain fonts are bigger or smaller than their nominal heights and widths would suggest.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.10 Looking Up Fonts

Function: x-list-fonts name &optional reference-face frame maximum width

This function returns a list of available font names that match name. name should be a string containing a font name in either the Fontconfig, GTK, or XLFD format (see Fonts in The GNU Emacs Manual). Within an XLFD string, wildcard characters may be used: the ‘*’ character matches any substring, and the ‘?’ character matches any single character. Case is ignored when matching font names.

If the optional arguments reference-face and frame are specified, the returned list includes only fonts that are the same size as reference-face (a face name) currently is on the frame frame.

The optional argument maximum sets a limit on how many fonts to return. If it is non-nil, then the return value is truncated after the first maximum matching fonts. Specifying a small value for maximum can make this function much faster, in cases where many fonts match the pattern.

The optional argument width specifies a desired font width. If it is non-nil, the function only returns those fonts whose characters are (on average) width times as wide as reference-face.

Function: x-family-fonts &optional family frame

This function returns a list describing the available fonts for family family on frame. If family is omitted or nil, this list applies to all families, and therefore, it contains all available fonts. Otherwise, family must be a string; it may contain the wildcards ‘?’ and ‘*’.

The list describes the display that frame is on; if frame is omitted or nil, it applies to the selected frame’s display (see section Input Focus).

Each element in the list is a vector of the following form:

[family width point-size weight slant
 fixed-p full registry-and-encoding]

The first five elements correspond to face attributes; if you specify these attributes for a face, it will use this font.

The last three elements give additional information about the font. fixed-p is non-nil if the font is fixed-pitch. full is the full name of the font, and registry-and-encoding is a string giving the registry and encoding of the font.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.11 Fontsets

A fontset is a list of fonts, each assigned to a range of character codes. An individual font cannot display the whole range of characters that Emacs supports, but a fontset can. Fontsets have names, just as fonts do, and you can use a fontset name in place of a font name when you specify the “font” for a frame or a face. Here is information about defining a fontset under Lisp program control.

Function: create-fontset-from-fontset-spec fontset-spec &optional style-variant-p noerror

This function defines a new fontset according to the specification string fontset-spec. The string should have this format:

fontpattern, [charset:font]…

Whitespace characters before and after the commas are ignored.

The first part of the string, fontpattern, should have the form of a standard X font name, except that the last two fields should be ‘fontset-alias’.

The new fontset has two names, one long and one short. The long name is fontpattern in its entirety. The short name is ‘fontset-alias’. You can refer to the fontset by either name. If a fontset with the same name already exists, an error is signaled, unless noerror is non-nil, in which case this function does nothing.

If optional argument style-variant-p is non-nil, that says to create bold, italic and bold-italic variants of the fontset as well. These variant fontsets do not have a short name, only a long one, which is made by altering fontpattern to indicate the bold and/or italic status.

The specification string also says which fonts to use in the fontset. See below for the details.

The construct ‘charset:font’ specifies which font to use (in this fontset) for one particular character set. Here, charset is the name of a character set, and font is the font to use for that character set. You can use this construct any number of times in the specification string.

For the remaining character sets, those that you don’t specify explicitly, Emacs chooses a font based on fontpattern: it replaces ‘fontset-alias’ with a value that names one character set. For the ASCII character set, ‘fontset-alias’ is replaced with ‘ISO8859-1’.

In addition, when several consecutive fields are wildcards, Emacs collapses them into a single wildcard. This is to prevent use of auto-scaled fonts. Fonts made by scaling larger fonts are not usable for editing, and scaling a smaller font is not useful because it is better to use the smaller font in its own size, which Emacs does.

Thus if fontpattern is this,

-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24

the font specification for ASCII characters would be this:

-*-fixed-medium-r-normal-*-24-*-ISO8859-1

and the font specification for Chinese GB2312 characters would be this:

-*-fixed-medium-r-normal-*-24-*-gb2312*-*

You may not have any Chinese font matching the above font specification. Most X distributions include only Chinese fonts that have ‘song ti’ or ‘fangsong ti’ in the family field. In such a case, ‘Fontset-n’ can be specified as below:

Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\
        chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*

Then, the font specifications for all but Chinese GB2312 characters have ‘fixed’ in the family field, and the font specification for Chinese GB2312 characters has a wild card ‘*’ in the family field.

Function: set-fontset-font name character font-spec &optional frame add

This function modifies the existing fontset name to use the font matching with font-spec for the character character.

If name is nil, this function modifies the fontset of the selected frame or that of frame if frame is not nil.

If name is t, this function modifies the default fontset, whose short name is ‘fontset-default’.

character may be a cons; (from . to), where from and to are character codepoints. In that case, use font-spec for all characters in the range from and to (inclusive).

character may be a charset. In that case, use font-spec for all character in the charsets.

character may be a script name. In that case, use font-spec for all character in the charsets.

font-spec may be a cons; (family . registry), where family is a family name of a font (possibly including a foundry name at the head), registry is a registry name of a font (possibly including an encoding name at the tail).

font-spec may be a font name string.

The optional argument add, if non-nil, specifies how to add font-spec to the font specifications previously set. If it is prepend, font-spec is prepended. If it is append, font-spec is appended. By default, font-spec overrides the previous settings.

For instance, this changes the default fontset to use a font of which family name is ‘Kochi Gothic’ for all characters belonging to the charset japanese-jisx0208.

(set-fontset-font t 'japanese-jisx0208
                  (font-spec :family "Kochi Gothic"))
Function: char-displayable-p char

This function returns t if Emacs ought to be able to display char. More precisely, if the selected frame’s fontset has a font to display the character set that char belongs to.

Fontsets can specify a font on a per-character basis; when the fontset does that, this function’s value may not be accurate.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.12 Low-Level Font Representation

Normally, it is not necessary to manipulate fonts directly. In case you need to do so, this section explains how.

In Emacs Lisp, fonts are represented using three different Lisp object types: font objects, font specs, and font entities.

Function: fontp object &optional type

Return t if object is a font object, font spec, or font entity. Otherwise, return nil.

The optional argument type, if non-nil, determines the exact type of Lisp object to check for. In that case, type should be one of font-object, font-spec, or font-entity.

A font object is a Lisp object that represents a font that Emacs has opened. Font objects cannot be modified in Lisp, but they can be inspected.

Function: font-at position &optional window string

Return the font object that is being used to display the character at position position in the window window. If window is nil, it defaults to the selected window. If string is nil, position specifies a position in the current buffer; otherwise, string should be a string, and position specifies a position in that string.

A font spec is a Lisp object that contains a set of specifications that can be used to find a font. More than one font may match the specifications in a font spec.

Function: font-spec &rest arguments

Return a new font spec using the specifications in arguments, which should come in property-value pairs. The possible specifications are as follows:

:name

The font name (a string), in either XLFD, Fontconfig, or GTK format. See Fonts in The GNU Emacs Manual.

:family
:foundry
:weight
:slant
:width

These have the same meanings as the face attributes of the same name. See section Face Attributes.

:size

The font size—either a non-negative integer that specifies the pixel size, or a floating-point number that specifies the point size.

:adstyle

Additional typographic style information for the font, such as ‘sans’. The value should be a string or a symbol.

:registry

The charset registry and encoding of the font, such as ‘iso8859-1’. The value should be a string or a symbol.

:script

The script that the font must support (a symbol).

:otf

The font must be an OpenType font that supports these OpenType features, provided Emacs is compiled with support for ‘libotf’ (a library for performing complex text layout in certain scripts). The value must be a list of the form

(script-tag langsys-tag gsub gpos)

where script-tag is the OpenType script tag symbol; langsys-tag is the OpenType language system tag symbol, or nil to use the default language system; gsub is a list of OpenType GSUB feature tag symbols, or nil if none is required; and gpos is a list of OpenType GPOS feature tag symbols, or nil if none is required. If gsub or gpos is a list, a nil element in that list means that the font must not match any of the remaining tag symbols. The gpos element may be omitted.

Function: font-put font-spec property value

Set the font property property in the font-spec font-spec to value.

A font entity is a reference to a font that need not be open. Its properties are intermediate between a font object and a font spec: like a font object, and unlike a font spec, it refers to a single, specific font. Unlike a font object, creating a font entity does not load the contents of that font into computer memory. Emacs may open multiple font objects of different sizes from a single font entity referring to a scalable font.

Function: find-font font-spec &optional frame

This function returns a font entity that best matches the font spec font-spec on frame frame. If frame is nil, it defaults to the selected frame.

Function: list-fonts font-spec &optional frame num prefer

This function returns a list of all font entities that match the font spec font-spec.

The optional argument frame, if non-nil, specifies the frame on which the fonts are to be displayed. The optional argument num, if non-nil, should be an integer that specifies the maximum length of the returned list. The optional argument prefer, if non-nil, should be another font spec, which is used to control the order of the returned list; the returned font entities are sorted in order of decreasing “closeness” to that font spec.

If you call set-face-attribute and pass a font spec, font entity, or font name string as the value of the :font attribute, Emacs opens the best “matching” font that is available for display. It then stores the corresponding font object as the actual value of the :font attribute for that face.

The following functions can be used to obtain information about a font. For these functions, the font argument can be a font object, a font entity, or a font spec.

Function: font-get font property

This function returns the value of the font property property for font.

If font is a font spec and the font spec does not specify property, the return value is nil. If font is a font object or font entity, the value for the :script property may be a list of scripts supported by the font.

Function: font-face-attributes font &optional frame

This function returns a list of face attributes corresponding to font. The optional argument frame specifies the frame on which the font is to be displayed. If it is nil, the selected frame is used. The return value has the form

(:family family :height height :weight weight
   :slant slant :width width)

where the values of family, height, weight, slant, and width are face attribute values. Some of these key-attribute pairs may be omitted from the list if they are not specified by font.

Function: font-xlfd-name font &optional fold-wildcards

This function returns the XLFD (X Logical Font Descriptor), a string, matching font. See Fonts in The GNU Emacs Manual, for information about XLFDs. If the name is too long for an XLFD (which can contain at most 255 characters), the function returns nil.

If the optional argument fold-wildcards is non-nil, consecutive wildcards in the XLFD are folded into one.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13 Fringes

On graphical displays, Emacs draws fringes next to each window: thin vertical strips down the sides which can display bitmaps indicating truncation, continuation, horizontal scrolling, and so on.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.1 Fringe Size and Position

The following buffer-local variables control the position and width of fringes in windows showing that buffer.

Variable: fringes-outside-margins

The fringes normally appear between the display margins and the window text. If the value is non-nil, they appear outside the display margins. See section Displaying in the Margins.

Variable: left-fringe-width

This variable, if non-nil, specifies the width of the left fringe in pixels. A value of nil means to use the left fringe width from the window’s frame.

Variable: right-fringe-width

This variable, if non-nil, specifies the width of the right fringe in pixels. A value of nil means to use the right fringe width from the window’s frame.

Any buffer which does not specify values for these variables uses the values specified by the left-fringe and right-fringe frame parameters (see section Layout Parameters).

The above variables actually take effect via the function set-window-buffer (see section Buffers and Windows), which calls set-window-fringes as a subroutine. If you change one of these variables, the fringe display is not updated in existing windows showing the buffer, unless you call set-window-buffer again in each affected window. You can also use set-window-fringes to control the fringe display in individual windows.

Function: set-window-fringes window left &optional right outside-margins

This function sets the fringe widths of window window. If window is nil, the selected window is used.

The argument left specifies the width in pixels of the left fringe, and likewise right for the right fringe. A value of nil for either one stands for the default width. If outside-margins is non-nil, that specifies that fringes should appear outside of the display margins.

Function: window-fringes &optional window

This function returns information about the fringes of a window window. If window is omitted or nil, the selected window is used. The value has the form (left-width right-width outside-margins).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.2 Fringe Indicators

Fringe indicators are tiny icons displayed in the window fringe to indicate truncated or continued lines, buffer boundaries, etc.

User Option: indicate-empty-lines

When this is non-nil, Emacs displays a special glyph in the fringe of each empty line at the end of the buffer, on graphical displays. See section Fringes. This variable is automatically buffer-local in every buffer.

User Option: indicate-buffer-boundaries

This buffer-local variable controls how the buffer boundaries and window scrolling are indicated in the window fringes.

Emacs can indicate the buffer boundaries—that is, the first and last line in the buffer—with angle icons when they appear on the screen. In addition, Emacs can display an up-arrow in the fringe to show that there is text above the screen, and a down-arrow to show there is text below the screen.

There are three kinds of basic values:

nil

Don’t display any of these fringe icons.

left

Display the angle icons and arrows in the left fringe.

right

Display the angle icons and arrows in the right fringe.

any non-alist

Display the angle icons in the left fringe and don’t display the arrows.

Otherwise the value should be an alist that specifies which fringe indicators to display and where. Each element of the alist should have the form (indicator . position). Here, indicator is one of top, bottom, up, down, and t (which covers all the icons not yet specified), while position is one of left, right and nil.

For example, ((top . left) (t . right)) places the top angle bitmap in left fringe, and the bottom angle bitmap as well as both arrow bitmaps in right fringe. To show the angle bitmaps in the left fringe, and no arrow bitmaps, use ((top . left) (bottom . left)).

Variable: fringe-indicator-alist

This buffer-local variable specifies the mapping from logical fringe indicators to the actual bitmaps displayed in the window fringes. The value is an alist of elements (indicator . bitmaps), where indicator specifies a logical indicator type and bitmaps specifies the fringe bitmaps to use for that indicator.

Each indicator should be one of the following symbols:

truncation, continuation.

Used for truncation and continuation lines.

up, down, top, bottom, top-bottom

Used when indicate-buffer-boundaries is non-nil: up and down indicate a buffer boundary lying above or below the window edge; top and bottom indicate the topmost and bottommost buffer text line; and top-bottom indicates where there is just one line of text in the buffer.

empty-line

Used to indicate empty lines when indicate-empty-lines is non-nil.

overlay-arrow

Used for overlay arrows (see section The Overlay Arrow).

Each bitmaps value may be a list of symbols (left right [left1 right1]). The left and right symbols specify the bitmaps shown in the left and/or right fringe, for the specific indicator. left1 and right1 are specific to the bottom and top-bottom indicators, and are used to indicate that the last text line has no final newline. Alternatively, bitmaps may be a single symbol which is used in both left and right fringes.

See section Fringe Bitmaps, for a list of standard bitmap symbols and how to define your own. In addition, nil represents the empty bitmap (i.e., an indicator that is not shown).

When fringe-indicator-alist has a buffer-local value, and there is no bitmap defined for a logical indicator, or the bitmap is t, the corresponding value from the default value of fringe-indicator-alist is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.3 Fringe Cursors

When a line is exactly as wide as the window, Emacs displays the cursor in the right fringe instead of using two lines. Different bitmaps are used to represent the cursor in the fringe depending on the current buffer’s cursor type.

User Option: overflow-newline-into-fringe

If this is non-nil, lines exactly as wide as the window (not counting the final newline character) are not continued. Instead, when point is at the end of the line, the cursor appears in the right fringe.

Variable: fringe-cursor-alist

This variable specifies the mapping from logical cursor type to the actual fringe bitmaps displayed in the right fringe. The value is an alist where each element has the form (cursor-type . bitmap), which means to use the fringe bitmap bitmap to display cursors of type cursor-type.

Each cursor-type should be one of box, hollow, bar, hbar, or hollow-small. The first four have the same meanings as in the cursor-type frame parameter (see section Cursor Parameters). The hollow-small type is used instead of hollow when the normal hollow-rectangle bitmap is too tall to fit on a specific display line.

Each bitmap should be a symbol specifying the fringe bitmap to be displayed for that logical cursor type. See section Fringe Bitmaps.

When fringe-cursor-alist has a buffer-local value, and there is no bitmap defined for a cursor type, the corresponding value from the default value of fringes-indicator-alist is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.4 Fringe Bitmaps

The fringe bitmaps are the actual bitmaps which represent the logical fringe indicators for truncated or continued lines, buffer boundaries, overlay arrows, etc. Each bitmap is represented by a symbol. These symbols are referred to by the variable fringe-indicator-alist, which maps fringe indicators to bitmaps (see section Fringe Indicators), and the variable fringe-cursor-alist, which maps fringe cursors to bitmaps (see section Fringe Cursors).

Lisp programs can also directly display a bitmap in the left or right fringe, by using a display property for one of the characters appearing in the line (see section Other Display Specifications). Such a display specification has the form

(fringe bitmap [face])

fringe is either the symbol left-fringe or right-fringe. bitmap is a symbol identifying the bitmap to display. The optional face names a face whose foreground color is used to display the bitmap; this face is automatically merged with the fringe face.

Here is a list of the standard fringe bitmaps defined in Emacs, and how they are currently used in Emacs (via fringe-indicator-alist and fringe-cursor-alist):

left-arrow, right-arrow

Used to indicate truncated lines.

left-curly-arrow, right-curly-arrow

Used to indicate continued lines.

right-triangle, left-triangle

The former is used by overlay arrows. The latter is unused.

up-arrow, down-arrow, top-left-angle top-right-angle
bottom-left-angle, bottom-right-angle
top-right-angle, top-left-angle
left-bracket, right-bracket, top-right-angle, top-left-angle

Used to indicate buffer boundaries.

filled-rectangle, hollow-rectangle
filled-square, hollow-square
vertical-bar, horizontal-bar

Used for different types of fringe cursors.

empty-line, exclamation-mark, question-mark, exclamation-mark

Not used by core Emacs features.

The next subsection describes how to define your own fringe bitmaps.

Function: fringe-bitmaps-at-pos &optional pos window

This function returns the fringe bitmaps of the display line containing position pos in window window. The return value has the form (left right ov), where left is the symbol for the fringe bitmap in the left fringe (or nil if no bitmap), right is similar for the right fringe, and ov is non-nil if there is an overlay arrow in the left fringe.

The value is nil if pos is not visible in window. If window is nil, that stands for the selected window. If pos is nil, that stands for the value of point in window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.5 Customizing Fringe Bitmaps

Function: define-fringe-bitmap bitmap bits &optional height width align

This function defines the symbol bitmap as a new fringe bitmap, or replaces an existing bitmap with that name.

The argument bits specifies the image to use. It should be either a string or a vector of integers, where each element (an integer) corresponds to one row of the bitmap. Each bit of an integer corresponds to one pixel of the bitmap, where the low bit corresponds to the rightmost pixel of the bitmap.

The height is normally the length of bits. However, you can specify a different height with non-nil height. The width is normally 8, but you can specify a different width with non-nil width. The width must be an integer between 1 and 16.

The argument align specifies the positioning of the bitmap relative to the range of rows where it is used; the default is to center the bitmap. The allowed values are top, center, or bottom.

The align argument may also be a list (align periodic) where align is interpreted as described above. If periodic is non-nil, it specifies that the rows in bits should be repeated enough times to reach the specified height.

Function: destroy-fringe-bitmap bitmap

This function destroy the fringe bitmap identified by bitmap. If bitmap identifies a standard fringe bitmap, it actually restores the standard definition of that bitmap, instead of eliminating it entirely.

Function: set-fringe-bitmap-face bitmap &optional face

This sets the face for the fringe bitmap bitmap to face. If face is nil, it selects the fringe face. The bitmap’s face controls the color to draw it in.

face is merged with the fringe face, so normally face should specify only the foreground color.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.6 The Overlay Arrow

The overlay arrow is useful for directing the user’s attention to a particular line in a buffer. For example, in the modes used for interface to debuggers, the overlay arrow indicates the line of code about to be executed. This feature has nothing to do with overlays (see section Overlays).

Variable: overlay-arrow-string

This variable holds the string to display to call attention to a particular line, or nil if the arrow feature is not in use. On a graphical display the contents of the string are ignored; instead a glyph is displayed in the fringe area to the left of the display area.

Variable: overlay-arrow-position

This variable holds a marker that indicates where to display the overlay arrow. It should point at the beginning of a line. On a non-graphical display the arrow text appears at the beginning of that line, overlaying any text that would otherwise appear. Since the arrow is usually short, and the line usually begins with indentation, normally nothing significant is overwritten.

The overlay-arrow string is displayed in any given buffer if the value of overlay-arrow-position in that buffer points into that buffer. Thus, it is possible to display multiple overlay arrow strings by creating buffer-local bindings of overlay-arrow-position. However, it is usually cleaner to use overlay-arrow-variable-list to achieve this result.

You can do a similar job by creating an overlay with a before-string property. See section Overlay Properties.

You can define multiple overlay arrows via the variable overlay-arrow-variable-list.

Variable: overlay-arrow-variable-list

This variable’s value is a list of variables, each of which specifies the position of an overlay arrow. The variable overlay-arrow-position has its normal meaning because it is on this list.

Each variable on this list can have properties overlay-arrow-string and overlay-arrow-bitmap that specify an overlay arrow string (for text terminals) or fringe bitmap (for graphical terminals) to display at the corresponding overlay arrow position. If either property is not set, the default overlay-arrow-string or overlay-arrow fringe indicator is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.14 Scroll Bars

Normally the frame parameter vertical-scroll-bars controls whether the windows in the frame have vertical scroll bars, and whether they are on the left or right. The frame parameter scroll-bar-width specifies how wide they are (nil meaning the default). See section Layout Parameters.

Function: frame-current-scroll-bars &optional frame

This function reports the scroll bar type settings for frame frame. The value is a cons cell (vertical-type . horizontal-type), where vertical-type is either left, right, or nil (which means no scroll bar.) horizontal-type is meant to specify the horizontal scroll bar type, but since they are not implemented, it is always nil.

You can enable or disable scroll bars for a particular buffer, by setting the variable vertical-scroll-bar. This variable automatically becomes buffer-local when set. The possible values are left, right, t, which means to use the frame’s default, and nil for no scroll bar.

You can also control this for individual windows. Call the function set-window-scroll-bars to specify what to do for a specific window:

Function: set-window-scroll-bars window width &optional vertical-type horizontal-type

This function sets the width and type of scroll bars for window window.

width specifies the scroll bar width in pixels (nil means use the width specified for the frame). vertical-type specifies whether to have a vertical scroll bar and, if so, where. The possible values are left, right and nil, just like the values of the vertical-scroll-bars frame parameter.

The argument horizontal-type is meant to specify whether and where to have horizontal scroll bars, but since they are not implemented, it has no effect. If window is nil, the selected window is used.

Function: window-scroll-bars &optional window

Report the width and type of scroll bars specified for window. If window is omitted or nil, the selected window is used. The value is a list of the form (width cols vertical-type horizontal-type). The value width is the value that was specified for the width (which may be nil); cols is the number of columns that the scroll bar actually occupies.

horizontal-type is not actually meaningful.

Function: window-scroll-bar-width &optional window

This function returns the width in pixels of window’s vertical scrollbar. window must be a live window, and defaults to the selected window.

If you don’t specify these values for a window with set-window-scroll-bars, the buffer-local variables scroll-bar-mode and scroll-bar-width in the buffer being displayed control the window’s vertical scroll bars. The function set-window-buffer examines these variables. If you change them in a buffer that is already visible in a window, you can make the window take note of the new values by calling set-window-buffer specifying the same buffer that is already displayed.

User Option: scroll-bar-mode

This variable, always local in all buffers, controls whether and where to put scroll bars in windows displaying the buffer. The possible values are nil for no scroll bar, left to put a scroll bar on the left, and right to put a scroll bar on the right.

Function: window-current-scroll-bars &optional window

This function reports the scroll bar type for window window. If window is omitted or nil, the selected window is used. The value is a cons cell (vertical-type . horizontal-type). Unlike window-scroll-bars, this reports the scroll bar type actually used, once frame defaults and scroll-bar-mode are taken into account.

Variable: scroll-bar-width

This variable, always local in all buffers, specifies the width of the buffer’s scroll bars, measured in pixels. A value of nil means to use the value specified by the frame.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.15 Window Dividers

Window dividers are bars drawn between a frame’s windows. A “right” divider is drawn between a window and any adjacent windows on the right. Its width (thickness) is specified by the frame parameter right-divider-width. A “bottom” divider is drawn between a window and adjacent windows on the bottom or the echo area. Its width is specified by the frame parameter bottom-divider-width. In either case, specifying a width of zero means to not draw such dividers. See section Layout Parameters.

Technically, a right divider “belongs” to the window on its left, which means that its width contributes to the total width of that window. A bottom divider “belongs” to the window above it, which means that its width contributes to the total height of that window. See section Window Sizes. When a window has both, a right and a bottom divider, the bottom divider “prevails”. This means that a bottom divider is drawn over the full total width of its window while the right divider ends above the bottom divider.

Dividers can be dragged with the mouse and are therefore useful for adjusting the sizes of adjacent windows with the mouse. They also serve to visually set apart adjacent windows when no scroll bars or mode lines are present. The following three faces allow to customize the appearance of dividers:

window-divider

When a divider is less than three pixels wide, it is drawn solidly with the foreground of this face. For larger dividers this face is used for the inner part only, excluding the first and last pixel.

window-divider-first-pixel

This is the face used for drawing the first pixel of a divider that is at least three pixels wide. To obtain a solid appearance, set this to the same value used for the window-divider face.

window-divider-last-pixel

This is the face used for drawing the last pixel of a divider that is at least three pixels wide. To obtain a solid appearance, set this to the same value used for the window-divider face.

You can get the sizes of the dividers of a specific window with the following two functions.

Function: window-right-divider-width &optional window

Return the width (thickness) in pixels of window’s right divider. window must be a live window and defaults to the selected one. The return value is always zero for a rightmost window.

Function: window-bottom-divider-width &optional window

Return the width (thickness) in pixels of window’s bottom divider. window must be a live window and defaults to the selected one. The return value is zero for the minibuffer window or a bottommost window on a minibuffer-less frame.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16 The display Property

The display text property (or overlay property) is used to insert images into text, and to control other aspects of how text displays. The value of the display property should be a display specification, or a list or vector containing several display specifications. Display specifications in the same display property value generally apply in parallel to the text they cover.

If several sources (overlays and/or a text property) specify values for the display property, only one of the values takes effect, following the rules of get-char-property. See section Examining Text Properties.

The rest of this section describes several kinds of display specifications and what they mean.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.1 Display Specs That Replace The Text

Some kinds of display specifications specify something to display instead of the text that has the property. These are called replacing display specifications. Emacs does not allow the user to interactively move point into the middle of buffer text that is replaced in this way.

If a list of display specifications includes more than one replacing display specification, the first overrides the rest. Replacing display specifications make most other display specifications irrelevant, since those don’t apply to the replacement.

For replacing display specifications, “the text that has the property” means all the consecutive characters that have the same Lisp object as their display property; these characters are replaced as a single unit. If two characters have different Lisp objects as their display properties (i.e., objects which are not eq), they are handled separately.

Here is an example which illustrates this point. A string serves as a replacing display specification, which replaces the text that has the property with the specified string (see section Other Display Specifications). Consider the following function:

(defun foo ()
  (dotimes (i 5)
    (let ((string (concat "A"))
          (start (+ i i (point-min))))
      (put-text-property start (1+ start) 'display string)
      (put-text-property start (+ 2 start) 'display string))))

This function gives each of the first ten characters in the buffer a display property which is a string "A", but they don’t all get the same string object. The first two characters get the same string object, so they are replaced with one ‘A’; the fact that the display property was assigned in two separate calls to put-text-property is irrelevant. Similarly, the next two characters get a second string (concat creates a new string object), so they are replaced with one ‘A’; and so on. Thus, the ten characters appear as five A’s.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.2 Specified Spaces

To display a space of specified width and/or height, use a display specification of the form (space . props), where props is a property list (a list of alternating properties and values). You can put this property on one or more consecutive characters; a space of the specified height and width is displayed in place of all of those characters. These are the properties you can use in props to specify the weight of the space:

:width width

If width is a number, it specifies that the space width should be width times the normal character width. width can also be a pixel width specification (see section Pixel Specification for Spaces).

:relative-width factor

Specifies that the width of the stretch should be computed from the first character in the group of consecutive characters that have the same display property. The space width is the width of that character, multiplied by factor.

:align-to hpos

Specifies that the space should be wide enough to reach hpos. If hpos is a number, it is measured in units of the normal character width. hpos can also be a pixel width specification (see section Pixel Specification for Spaces).

You should use one and only one of the above properties. You can also specify the height of the space, with these properties:

:height height

Specifies the height of the space. If height is a number, it specifies that the space height should be height times the normal character height. The height may also be a pixel height specification (see section Pixel Specification for Spaces).

:relative-height factor

Specifies the height of the space, multiplying the ordinary height of the text having this display specification by factor.

:ascent ascent

If the value of ascent is a non-negative number no greater than 100, it specifies that ascent percent of the height of the space should be considered as the ascent of the space—that is, the part above the baseline. The ascent may also be specified in pixel units with a pixel ascent specification (see section Pixel Specification for Spaces).

Don’t use both :height and :relative-height together.

The :width and :align-to properties are supported on non-graphic terminals, but the other space properties in this section are not.

Note that space properties are treated as paragraph separators for the purposes of reordering bidirectional text for display. See section Bidirectional Display, for the details.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.3 Pixel Specification for Spaces

The value of the :width, :align-to, :height, and :ascent properties can be a special kind of expression that is evaluated during redisplay. The result of the evaluation is used as an absolute number of pixels.

The following expressions are supported:

  expr ::= num | (num) | unit | elem | pos | image | form
  num  ::= integer | float | symbol
  unit ::= in | mm | cm | width | height
  elem ::= left-fringe | right-fringe | left-margin | right-margin
        |  scroll-bar | text
  pos  ::= left | center | right
  form ::= (num . expr) | (op expr ...)
  op   ::= + | -

The form num specifies a fraction of the default frame font height or width. The form (num) specifies an absolute number of pixels. If num is a symbol, symbol, its buffer-local variable binding is used.

The in, mm, and cm units specify the number of pixels per inch, millimeter, and centimeter, respectively. The width and height units correspond to the default width and height of the current face. An image specification image corresponds to the width or height of the image.

The elements left-fringe, right-fringe, left-margin, right-margin, scroll-bar, and text specify to the width of the corresponding area of the window.

The left, center, and right positions can be used with :align-to to specify a position relative to the left edge, center, or right edge of the text area.

Any of the above window elements (except text) can also be used with :align-to to specify that the position is relative to the left edge of the given area. Once the base offset for a relative position has been set (by the first occurrence of one of these symbols), further occurrences of these symbols are interpreted as the width of the specified area. For example, to align to the center of the left-margin, use

:align-to (+ left-margin (0.5 . left-margin))

If no specific base offset is set for alignment, it is always relative to the left edge of the text area. For example, ‘:align-to 0’ in a header-line aligns with the first text column in the text area.

A value of the form (num . expr) stands for the product of the values of num and expr. For example, (2 . in) specifies a width of 2 inches, while (0.5 . image) specifies half the width (or height) of the specified image.

The form (+ expr ...) adds up the value of the expressions. The form (- expr ...) negates or subtracts the value of the expressions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.4 Other Display Specifications

Here are the other sorts of display specifications that you can use in the display text property.

string

Display string instead of the text that has this property.

Recursive display specifications are not supported—string’s display properties, if any, are not used.

(image . image-props)

This kind of display specification is an image descriptor (see section Images). When used as a display specification, it means to display the image instead of the text that has the display specification.

(slice x y width height)

This specification together with image specifies a slice (a partial area) of the image to display. The elements y and x specify the top left corner of the slice, within the image; width and height specify the width and height of the slice. Integers are numbers of pixels. A floating-point number in the range 0.0–1.0 stands for that fraction of the width or height of the entire image.

((margin nil) string)

A display specification of this form means to display string instead of the text that has the display specification, at the same position as that text. It is equivalent to using just string, but it is done as a special case of marginal display (see section Displaying in the Margins).

(left-fringe bitmap [face])
(right-fringe bitmap [face])

This display specification on any character of a line of text causes the specified bitmap be displayed in the left or right fringes for that line, instead of the characters that have the display specification. The optional face specifies the colors to be used for the bitmap. See section Fringe Bitmaps, for the details.

(space-width factor)

This display specification affects all the space characters within the text that has the specification. It displays all of these spaces factor times as wide as normal. The element factor should be an integer or float. Characters other than spaces are not affected at all; in particular, this has no effect on tab characters.

(height height)

This display specification makes the text taller or shorter. Here are the possibilities for height:

(+ n)

This means to use a font that is n steps larger. A “step” is defined by the set of available fonts—specifically, those that match what was otherwise specified for this text, in all attributes except height. Each size for which a suitable font is available counts as another step. n should be an integer.

(- n)

This means to use a font that is n steps smaller.

a number, factor

A number, factor, means to use a font that is factor times as tall as the default font.

a symbol, function

A symbol is a function to compute the height. It is called with the current height as argument, and should return the new height to use.

anything else, form

If the height value doesn’t fit the previous possibilities, it is a form. Emacs evaluates it to get the new height, with the symbol height bound to the current specified font height.

(raise factor)

This kind of display specification raises or lowers the text it applies to, relative to the baseline of the line.

factor must be a number, which is interpreted as a multiple of the height of the affected text. If it is positive, that means to display the characters raised. If it is negative, that means to display them lower down.

If the text also has a height display specification, that does not affect the amount of raising or lowering, which is based on the faces used for the text.

You can make any display specification conditional. To do that, package it in another list of the form (when condition . spec). Then the specification spec applies only when condition evaluates to a non-nil value. During the evaluation, object is bound to the string or buffer having the conditional display property. position and buffer-position are bound to the position within object and the buffer position where the display property was found, respectively. Both positions can be different when object is a string.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.5 Displaying in the Margins

A buffer can have blank areas called display margins on the left and on the right. Ordinary text never appears in these areas, but you can put things into the display margins using the display property. There is currently no way to make text or images in the margin mouse-sensitive.

The way to display something in the margins is to specify it in a margin display specification in the display property of some text. This is a replacing display specification, meaning that the text you put it on does not get displayed; the margin display appears, but that text does not.

A margin display specification looks like ((margin right-margin) spec) or ((margin left-margin) spec). Here, spec is another display specification that says what to display in the margin. Typically it is a string of text to display, or an image descriptor.

To display something in the margin in association with certain buffer text, without altering or preventing the display of that text, put a before-string property on the text and put the margin display specification on the contents of the before-string.

Before the display margins can display anything, you must give them a nonzero width. The usual way to do that is to set these variables:

Variable: left-margin-width

This variable specifies the width of the left margin, in character cell (a.k.a. “column”) units. It is buffer-local in all buffers. A value of nil means no left marginal area.

Variable: right-margin-width

This variable specifies the width of the right margin, in character cell units. It is buffer-local in all buffers. A value of nil means no right marginal area.

Setting these variables does not immediately affect the window. These variables are checked when a new buffer is displayed in the window. Thus, you can make changes take effect by calling set-window-buffer.

You can also set the margin widths immediately.

Function: set-window-margins window left &optional right

This function specifies the margin widths for window window, in character cell units. The argument left controls the left margin, and right controls the right margin (default 0).

Function: window-margins &optional window

This function returns the width of the left and right margins of window as a cons cell of the form (left . right). If one of the two marginal areas does not exist, its width is returned as nil; if neither of the two margins exist, the function returns (nil). If window is nil, the selected window is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17 Images

To display an image in an Emacs buffer, you must first create an image descriptor, then use it as a display specifier in the display property of text that is displayed (see section The display Property).

Emacs is usually able to display images when it is run on a graphical terminal. Images cannot be displayed in a text terminal, on certain graphical terminals that lack the support for this, or if Emacs is compiled without image support. You can use the function display-images-p to determine if images can in principle be displayed (see section Display Feature Testing).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.1 Image Formats

Emacs can display a number of different image formats. Some of these image formats are supported only if particular support libraries are installed. On some platforms, Emacs can load support libraries on demand; if so, the variable dynamic-library-alist can be used to modify the set of known names for these dynamic libraries. See section Dynamically Loaded Libraries.

Supported image formats (and the required support libraries) include PBM and XBM (which do not depend on support libraries and are always available), XPM (libXpm), GIF (libgif or libungif), PostScript (gs), JPEG (libjpeg), TIFF (libtiff), PNG (libpng), and SVG (librsvg).

Each of these image formats is associated with an image type symbol. The symbols for the above formats are, respectively, pbm, xbm, xpm, gif, postscript, jpeg, tiff, png, and svg.

Furthermore, if you build Emacs with ImageMagick (libMagickWand) support, Emacs can display any image format that ImageMagick can. See section ImageMagick Images. All images displayed via ImageMagick have type symbol imagemagick.

Variable: image-types

This variable contains a list of type symbols for image formats which are potentially supported in the current configuration.

“Potentially” means that Emacs knows about the image types, not necessarily that they can be used (for example, they could depend on unavailable dynamic libraries). To know which image types are really available, use image-type-available-p.

Function: image-type-available-p type

This function returns non-nil if images of type type can be loaded and displayed. type must be an image type symbol.

For image types whose support libraries are statically linked, this function always returns t. For image types whose support libraries are dynamically loaded, it returns t if the library could be loaded and nil otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.2 Image Descriptors

An image descriptor is a list which specifies the underlying data for an image, and how to display it. It is typically used as the value of a display overlay or text property (see section Other Display Specifications); but See section Showing Images, for convenient helper functions to insert images into buffers.

Each image descriptor has the form (image . props), where props is a property list of alternating keyword symbols and values, including at least the pair :type type that specifies the image type.

The following is a list of properties that are meaningful for all image types (there are also properties which are meaningful only for certain image types, as documented in the following subsections):

:type type

The image type. See section Image Formats. Every image descriptor must include this property.

:file file

This says to load the image from file file. If file is not an absolute file name, it is expanded in data-directory.

:data data

This specifies the raw image data. Each image descriptor must have either :data or :file, but not both.

For most image types, the value of a :data property should be a string containing the image data. Some image types do not support :data; for some others, :data alone is not enough, so you need to use other image properties along with :data. See the following subsections for details.

:margin margin

This specifies how many pixels to add as an extra margin around the image. The value, margin, must be a non-negative number, or a pair (x . y) of such numbers. If it is a pair, x specifies how many pixels to add horizontally, and y specifies how many pixels to add vertically. If :margin is not specified, the default is zero.

:ascent ascent

This specifies the amount of the image’s height to use for its ascent—that is, the part above the baseline. The value, ascent, must be a number in the range 0 to 100, or the symbol center.

If ascent is a number, that percentage of the image’s height is used for its ascent.

If ascent is center, the image is vertically centered around a centerline which would be the vertical centerline of text drawn at the position of the image, in the manner specified by the text properties and overlays that apply to the image.

If this property is omitted, it defaults to 50.

:relief relief

This adds a shadow rectangle around the image. The value, relief, specifies the width of the shadow lines, in pixels. If relief is negative, shadows are drawn so that the image appears as a pressed button; otherwise, it appears as an unpressed button.

:conversion algorithm

This specifies a conversion algorithm that should be applied to the image before it is displayed; the value, algorithm, specifies which algorithm.

laplace
emboss

Specifies the Laplace edge detection algorithm, which blurs out small differences in color while highlighting larger differences. People sometimes consider this useful for displaying the image for a “disabled” button.

(edge-detection :matrix matrix :color-adjust adjust)

Specifies a general edge-detection algorithm. matrix must be either a nine-element list or a nine-element vector of numbers. A pixel at position x/y in the transformed image is computed from original pixels around that position. matrix specifies, for each pixel in the neighborhood of x/y, a factor with which that pixel will influence the transformed pixel; element 0 specifies the factor for the pixel at x-1/y-1, element 1 the factor for the pixel at x/y-1 etc., as shown below:

  (x-1/y-1  x/y-1  x+1/y-1
   x-1/y    x/y    x+1/y
   x-1/y+1  x/y+1  x+1/y+1)

The resulting pixel is computed from the color intensity of the color resulting from summing up the RGB values of surrounding pixels, multiplied by the specified factors, and dividing that sum by the sum of the factors’ absolute values.

Laplace edge-detection currently uses a matrix of

  (1  0  0
   0  0  0
   0  0 -1)

Emboss edge-detection uses a matrix of

  ( 2 -1  0
   -1  0  1
    0  1 -2)
disabled

Specifies transforming the image so that it looks “disabled”.

:mask mask

If mask is heuristic or (heuristic bg), build a clipping mask for the image, so that the background of a frame is visible behind the image. If bg is not specified, or if bg is t, determine the background color of the image by looking at the four corners of the image, assuming the most frequently occurring color from the corners is the background color of the image. Otherwise, bg must be a list (red green blue) specifying the color to assume for the background of the image.

If mask is nil, remove a mask from the image, if it has one. Images in some formats include a mask which can be removed by specifying :mask nil.

:pointer shape

This specifies the pointer shape when the mouse pointer is over this image. See section Pointer Shape, for available pointer shapes.

:map map

This associates an image map of hot spots with this image.

An image map is an alist where each element has the format (area id plist). An area is specified as either a rectangle, a circle, or a polygon.

A rectangle is a cons (rect . ((x0 . y0) . (x1 . y1))) which specifies the pixel coordinates of the upper left and bottom right corners of the rectangle area.

A circle is a cons (circle . ((x0 . y0) . r)) which specifies the center and the radius of the circle; r may be a float or integer.

A polygon is a cons (poly . [x0 y0 x1 y1 ...]) where each pair in the vector describes one corner in the polygon.

When the mouse pointer lies on a hot-spot area of an image, the plist of that hot-spot is consulted; if it contains a help-echo property, that defines a tool-tip for the hot-spot, and if it contains a pointer property, that defines the shape of the mouse cursor when it is on the hot-spot. See section Pointer Shape, for available pointer shapes.

When you click the mouse when the mouse pointer is over a hot-spot, an event is composed by combining the id of the hot-spot with the mouse event; for instance, [area4 mouse-1] if the hot-spot’s id is area4.

Function: image-mask-p spec &optional frame

This function returns t if image spec has a mask bitmap. frame is the frame on which the image will be displayed. frame nil or omitted means to use the selected frame (see section Input Focus).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.3 XBM Images

To use XBM format, specify xbm as the image type. This image format doesn’t require an external library, so images of this type are always supported.

Additional image properties supported for the xbm image type are:

:foreground foreground

The value, foreground, should be a string specifying the image foreground color, or nil for the default color. This color is used for each pixel in the XBM that is 1. The default is the frame’s foreground color.

:background background

The value, background, should be a string specifying the image background color, or nil for the default color. This color is used for each pixel in the XBM that is 0. The default is the frame’s background color.

If you specify an XBM image using data within Emacs instead of an external file, use the following three properties:

:data data

The value, data, specifies the contents of the image. There are three formats you can use for data:

:width width

The value, width, specifies the width of the image, in pixels.

:height height

The value, height, specifies the height of the image, in pixels.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.4 XPM Images

To use XPM format, specify xpm as the image type. The additional image property :color-symbols is also meaningful with the xpm image type:

:color-symbols symbols

The value, symbols, should be an alist whose elements have the form (name . color). In each element, name is the name of a color as it appears in the image file, and color specifies the actual color to use for displaying that name.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.5 PostScript Images

To use PostScript for an image, specify image type postscript. This works only if you have Ghostscript installed. You must always use these three properties:

:pt-width width

The value, width, specifies the width of the image measured in points (1/72 inch). width must be an integer.

:pt-height height

The value, height, specifies the height of the image in points (1/72 inch). height must be an integer.

:bounding-box box

The value, box, must be a list or vector of four integers, which specifying the bounding box of the PostScript image, analogous to the ‘BoundingBox’ comment found in PostScript files.

%%BoundingBox: 22 171 567 738

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.6 ImageMagick Images

If you build Emacs with ImageMagick support, you can use the ImageMagick library to load many image formats (see File Conveniences in The GNU Emacs Manual). The image type symbol for images loaded via ImageMagick is imagemagick, regardless of the actual underlying image format.

Function: imagemagick-types

This function returns a list of image file extensions supported by the current ImageMagick installation. Each list element is a symbol representing an internal ImageMagick name for an image type, such as BMP for .bmp images.

User Option: imagemagick-enabled-types

The value of this variable is a list of ImageMagick image types which Emacs may attempt to render using ImageMagick. Each list element should be one of the symbols in the list returned by imagemagick-types, or an equivalent string. Alternatively, a value of t enables ImageMagick for all possible image types. Regardless of the value of this variable, imagemagick-types-inhibit (see below) takes precedence.

User Option: imagemagick-types-inhibit

The value of this variable lists the ImageMagick image types which should never be rendered using ImageMagick, regardless of the value of imagemagick-enabled-types. A value of t disables ImageMagick entirely.

Variable: image-format-suffixes

This variable is an alist mapping image types to file name extensions. Emacs uses this in conjunction with the :format image property (see below) to give a hint to the ImageMagick library as to the type of an image. Each element has the form (type extension), where type is a symbol specifying an image content-type, and extension is a string that specifies the associated file name extension.

Images loaded with ImageMagick support the following additional image descriptor properties:

:background background

background, if non-nil, should be a string specifying a color, which is used as the image’s background color if the image supports transparency. If the value is nil, it defaults to the frame’s background color.

:width width, :height height

The :width and :height keywords are used for scaling the image. If only one of them is specified, the other one will be calculated so as to preserve the aspect ratio. If both are specified, aspect ratio may not be preserved.

:max-width max-width, :max-height max-height

The :max-width and :max-height keywords are used for scaling if the size of the image of the image exceeds these values. If :width is set it will have precedence over max-width, and if :height is set it will have precedence over max-height, but you can otherwise mix these keywords as you wish. :max-width and :max-height will always preserve the aspect ratio.

:format type

The value, type, should be a symbol specifying the type of the image data, as found in image-format-suffixes. This is used when the image does not have an associated file name, to provide a hint to ImageMagick to help it detect the image type.

:rotation angle

Specifies a rotation angle in degrees.

:index frame

See section Multi-Frame Images.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.7 Other Image Types

For PBM images, specify image type pbm. Color, gray-scale and monochromatic images are supported. For mono PBM images, two additional image properties are supported.

:foreground foreground

The value, foreground, should be a string specifying the image foreground color, or nil for the default color. This color is used for each pixel in the PBM that is 1. The default is the frame’s foreground color.

:background background

The value, background, should be a string specifying the image background color, or nil for the default color. This color is used for each pixel in the PBM that is 0. The default is the frame’s background color.

The remaining image types that Emacs can support are:

GIF

Image type gif. Supports the :index property. See section Multi-Frame Images.

JPEG

Image type jpeg.

PNG

Image type png.

SVG

Image type svg.

TIFF

Image type tiff. Supports the :index property. See section Multi-Frame Images.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.8 Defining Images

The functions create-image, defimage and find-image provide convenient ways to create image descriptors.

Function: create-image file-or-data &optional type data-p &rest props

This function creates and returns an image descriptor which uses the data in file-or-data. file-or-data can be a file name or a string containing the image data; data-p should be nil for the former case, non-nil for the latter case.

The optional argument type is a symbol specifying the image type. If type is omitted or nil, create-image tries to determine the image type from the file’s first few bytes, or else from the file’s name.

The remaining arguments, props, specify additional image properties—for example,

(create-image "foo.xpm" 'xpm nil :heuristic-mask t)

The function returns nil if images of this type are not supported. Otherwise it returns an image descriptor.

Macro: defimage symbol specs &optional doc

This macro defines symbol as an image name. The arguments specs is a list which specifies how to display the image. The third argument, doc, is an optional documentation string.

Each argument in specs has the form of a property list, and each one should specify at least the :type property and either the :file or the :data property. The value of :type should be a symbol specifying the image type, the value of :file is the file to load the image from, and the value of :data is a string containing the actual image data. Here is an example:

(defimage test-image
  ((:type xpm :file "~/test1.xpm")
   (:type xbm :file "~/test1.xbm")))

defimage tests each argument, one by one, to see if it is usable—that is, if the type is supported and the file exists. The first usable argument is used to make an image descriptor which is stored in symbol.

If none of the alternatives will work, then symbol is defined as nil.

Function: find-image specs

This function provides a convenient way to find an image satisfying one of a list of image specifications specs.

Each specification in specs is a property list with contents depending on image type. All specifications must at least contain the properties :type type and either :file file or :data data, where type is a symbol specifying the image type, e.g., xbm, file is the file to load the image from, and data is a string containing the actual image data. The first specification in the list whose type is supported, and file exists, is used to construct the image specification to be returned. If no specification is satisfied, nil is returned.

The image is looked for in image-load-path.

Variable: image-load-path

This variable’s value is a list of locations in which to search for image files. If an element is a string or a variable symbol whose value is a string, the string is taken to be the name of a directory to search. If an element is a variable symbol whose value is a list, that is taken to be a list of directory names to search.

The default is to search in the images subdirectory of the directory specified by data-directory, then the directory specified by data-directory, and finally in the directories in load-path. Subdirectories are not automatically included in the search, so if you put an image file in a subdirectory, you have to supply the subdirectory name explicitly. For example, to find the image images/foo/bar.xpm within data-directory, you should specify the image as follows:

(defimage foo-image '((:type xpm :file "foo/bar.xpm")))
Function: image-load-path-for-library library image &optional path no-error

This function returns a suitable search path for images used by the Lisp package library.

The function searches for image first using image-load-path, excluding data-directory/images, and then in load-path, followed by a path suitable for library, which includes ../../etc/images and ../etc/images relative to the library file itself, and finally in data-directory/images.

Then this function returns a list of directories which contains first the directory in which image was found, followed by the value of load-path. If path is given, it is used instead of load-path.

If no-error is non-nil and a suitable path can’t be found, don’t signal an error. Instead, return a list of directories as before, except that nil appears in place of the image directory.

Here is an example of using image-load-path-for-library:

(defvar image-load-path) ; shush compiler
(let* ((load-path (image-load-path-for-library
                    "mh-e" "mh-logo.xpm"))
       (image-load-path (cons (car load-path)
                              image-load-path)))
  (mh-tool-bar-folder-buttons-init))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.9 Showing Images

You can use an image descriptor by setting up the display property yourself, but it is easier to use the functions in this section.

Function: insert-image image &optional string area slice

This function inserts image in the current buffer at point. The value image should be an image descriptor; it could be a value returned by create-image, or the value of a symbol defined with defimage. The argument string specifies the text to put in the buffer to hold the image. If it is omitted or nil, insert-image uses " " by default.

The argument area specifies whether to put the image in a margin. If it is left-margin, the image appears in the left margin; right-margin specifies the right margin. If area is nil or omitted, the image is displayed at point within the buffer’s text.

The argument slice specifies a slice of the image to insert. If slice is nil or omitted the whole image is inserted. Otherwise, slice is a list (x y width height) which specifies the x and y positions and width and height of the image area to insert. Integer values are in units of pixels. A floating-point number in the range 0.0–1.0 stands for that fraction of the width or height of the entire image.

Internally, this function inserts string in the buffer, and gives it a display property which specifies image. See section The display Property.

Function: insert-sliced-image image &optional string area rows cols

This function inserts image in the current buffer at point, like insert-image, but splits the image into rowsxcols equally sized slices.

If an image is inserted “sliced”, Emacs displays each slice as a separate image, and allow more intuitive scrolling up/down, instead of jumping up/down the entire image when paging through a buffer that displays (large) images.

Function: put-image image pos &optional string area

This function puts image image in front of pos in the current buffer. The argument pos should be an integer or a marker. It specifies the buffer position where the image should appear. The argument string specifies the text that should hold the image as an alternative to the default.

The argument image must be an image descriptor, perhaps returned by create-image or stored by defimage.

The argument area specifies whether to put the image in a margin. If it is left-margin, the image appears in the left margin; right-margin specifies the right margin. If area is nil or omitted, the image is displayed at point within the buffer’s text.

Internally, this function creates an overlay, and gives it a before-string property containing text that has a display property whose value is the image. (Whew!)

Function: remove-images start end &optional buffer

This function removes images in buffer between positions start and end. If buffer is omitted or nil, images are removed from the current buffer.

This removes only images that were put into buffer the way put-image does it, not images that were inserted with insert-image or in other ways.

Function: image-size spec &optional pixels frame

This function returns the size of an image as a pair (width . height). spec is an image specification. pixels non-nil means return sizes measured in pixels, otherwise return sizes measured in canonical character units (fractions of the width/height of the frame’s default font). frame is the frame on which the image will be displayed. frame null or omitted means use the selected frame (see section Input Focus).

Variable: max-image-size

This variable is used to define the maximum size of image that Emacs will load. Emacs will refuse to load (and display) any image that is larger than this limit.

If the value is an integer, it directly specifies the maximum image height and width, measured in pixels. If it is floating point, it specifies the maximum image height and width as a ratio to the frame height and width. If the value is non-numeric, there is no explicit limit on the size of images.

The purpose of this variable is to prevent unreasonably large images from accidentally being loaded into Emacs. It only takes effect the first time an image is loaded. Once an image is placed in the image cache, it can always be displayed, even if the value of max-image-size is subsequently changed (see section Image Cache).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.10 Multi-Frame Images

Some image files can contain more than one image. We say that there are multiple “frames” in the image. At present, Emacs supports multiple frames for GIF, TIFF, and certain ImageMagick formats such as DJVM.

The frames can be used either to represent multiple “pages” (this is usually the case with multi-frame TIFF files, for example), or to create animation (usually the case with multi-frame GIF files).

A multi-frame image has a property :index, whose value is an integer (counting from 0) that specifies which frame is being displayed.

Function: image-multi-frame-p image

This function returns non-nil if image contains more than one frame. The actual return value is a cons (nimages . delay), where nimages is the number of frames and delay is the delay in seconds between them, or nil if the image does not specify a delay. Images that are intended to be animated usually specify a frame delay, whereas ones that are intended to be treated as multiple pages do not.

Function: image-current-frame image

This function returns the index of the current frame number for image, counting from 0.

Function: image-show-frame image n &optional nocheck

This function switches image to frame number n. It replaces a frame number outside the valid range with that of the end of the range, unless nocheck is non-nil. If image does not contain a frame with the specified number, the image displays as a hollow box.

Function: image-animate image &optional index limit

This function animates image. The optional integer index specifies the frame from which to start (default 0). The optional argument limit controls the length of the animation. If omitted or nil, the image animates once only; if t it loops forever; if a number animation stops after that many seconds.

Animation operates by means of a timer. Note that Emacs imposes a minimum frame delay of 0.01 (image-minimum-frame-delay) seconds. If the image itself does not specify a delay, Emacs uses image-default-frame-delay.

Function: image-animate-timer image

This function returns the timer responsible for animating image, if there is one.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.11 Image Cache

Emacs caches images so that it can display them again more efficiently. When Emacs displays an image, it searches the image cache for an existing image specification equal to the desired specification. If a match is found, the image is displayed from the cache. Otherwise, Emacs loads the image normally.

Function: image-flush spec &optional frame

This function removes the image with specification spec from the image cache of frame frame. Image specifications are compared using equal. If frame is nil, it defaults to the selected frame. If frame is t, the image is flushed on all existing frames.

In Emacs’s current implementation, each graphical terminal possesses an image cache, which is shared by all the frames on that terminal (see section Multiple Terminals). Thus, refreshing an image in one frame also refreshes it in all other frames on the same terminal.

One use for image-flush is to tell Emacs about a change in an image file. If an image specification contains a :file property, the image is cached based on the file’s contents when the image is first displayed. Even if the file subsequently changes, Emacs continues displaying the old version of the image. Calling image-flush flushes the image from the cache, forcing Emacs to re-read the file the next time it needs to display that image.

Another use for image-flush is for memory conservation. If your Lisp program creates a large number of temporary images over a period much shorter than image-cache-eviction-delay (see below), you can opt to flush unused images yourself, instead of waiting for Emacs to do it automatically.

Function: clear-image-cache &optional filter

This function clears an image cache, removing all the images stored in it. If filter is omitted or nil, it clears the cache for the selected frame. If filter is a frame, it clears the cache for that frame. If filter is t, all image caches are cleared. Otherwise, filter is taken to be a file name, and all images associated with that file name are removed from all image caches.

If an image in the image cache has not been displayed for a specified period of time, Emacs removes it from the cache and frees the associated memory.

Variable: image-cache-eviction-delay

This variable specifies the number of seconds an image can remain in the cache without being displayed. When an image is not displayed for this length of time, Emacs removes it from the image cache.

Under some circumstances, if the number of images in the cache grows too large, the actual eviction delay may be shorter than this.

If the value is nil, Emacs does not remove images from the cache except when you explicitly clear it. This mode can be useful for debugging.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18 Buttons

The Button package defines functions for inserting and manipulating buttons that can be activated with the mouse or via keyboard commands. These buttons are typically used for various kinds of hyperlinks.

A button is essentially a set of text or overlay properties, attached to a stretch of text in a buffer. These properties are called button properties. One of these properties, the action property, specifies a function which is called when the user invokes the button using the keyboard or the mouse. The action function may examine the button and use its other properties as desired.

In some ways, the Button package duplicates the functionality in the Widget package. See Introduction in The Emacs Widget Library. The advantage of the Button package is that it is faster, smaller, and simpler to program. From the point of view of the user, the interfaces produced by the two packages are very similar.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.1 Button Properties

Each button has an associated list of properties defining its appearance and behavior, and other arbitrary properties may be used for application specific purposes. The following properties have special meaning to the Button package:

action

The function to call when the user invokes the button, which is passed the single argument button. By default this is ignore, which does nothing.

mouse-action

This is similar to action, and when present, will be used instead of action for button invocations resulting from mouse-clicks (instead of the user hitting RET). If not present, mouse-clicks use action instead.

face

This is an Emacs face controlling how buttons of this type are displayed; by default this is the button face.

mouse-face

This is an additional face which controls appearance during mouse-overs (merged with the usual button face); by default this is the usual Emacs highlight face.

keymap

The button’s keymap, defining bindings active within the button region. By default this is the usual button region keymap, stored in the variable button-map, which defines RET and mouse-2 to invoke the button.

type

The button type. See section Button Types.

help-echo

A string displayed by the Emacs tool-tip help system; by default, "mouse-2, RET: Push this button".

follow-link

The follow-link property, defining how a Mouse-1 click behaves on this button, See section Defining Clickable Text.

button

All buttons have a non-nil button property, which may be useful in finding regions of text that comprise buttons (which is what the standard button functions do).

There are other properties defined for the regions of text in a button, but these are not generally interesting for typical uses.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.2 Button Types

Every button has a button type, which defines default values for the button’s properties. Button types are arranged in a hierarchy, with specialized types inheriting from more general types, so that it’s easy to define special-purpose types of buttons for specific tasks.

Function: define-button-type name &rest properties

Define a ‘button type’ called name (a symbol). The remaining arguments form a sequence of property value pairs, specifying default property values for buttons with this type (a button’s type may be set by giving it a type property when creating the button, using the :type keyword argument).

In addition, the keyword argument :supertype may be used to specify a button-type from which name inherits its default property values. Note that this inheritance happens only when name is defined; subsequent changes to a supertype are not reflected in its subtypes.

Using define-button-type to define default properties for buttons is not necessary—buttons without any specified type use the built-in button-type button—but it is encouraged, since doing so usually makes the resulting code clearer and more efficient.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.3 Making Buttons

Buttons are associated with a region of text, using an overlay or text properties to hold button-specific information, all of which are initialized from the button’s type (which defaults to the built-in button type button). Like all Emacs text, the appearance of the button is governed by the face property; by default (via the face property inherited from the button button-type) this is a simple underline, like a typical web-page link.

For convenience, there are two sorts of button-creation functions, those that add button properties to an existing region of a buffer, called make-...button, and those that also insert the button text, called insert-...button.

The button-creation functions all take the &rest argument properties, which should be a sequence of property value pairs, specifying properties to add to the button; see Button Properties. In addition, the keyword argument :type may be used to specify a button-type from which to inherit other properties; see Button Types. Any properties not explicitly specified during creation will be inherited from the button’s type (if the type defines such a property).

The following functions add a button using an overlay (see section Overlays) to hold the button properties:

Function: make-button beg end &rest properties

This makes a button from beg to end in the current buffer, and returns it.

Function: insert-button label &rest properties

This insert a button with the label label at point, and returns it.

The following functions are similar, but using text properties (see section Text Properties) to hold the button properties. Such buttons do not add markers to the buffer, so editing in the buffer does not slow down if there is an extremely large numbers of buttons. However, if there is an existing face text property on the text (e.g., a face assigned by Font Lock mode), the button face may not be visible. Both of these functions return the starting position of the new button.

Function: make-text-button beg end &rest properties

This makes a button from beg to end in the current buffer, using text properties.

Function: insert-text-button label &rest properties

This inserts a button with the label label at point, using text properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.4 Manipulating Buttons

These are functions for getting and setting properties of buttons. Often these are used by a button’s invocation function to determine what to do.

Where a button parameter is specified, it means an object referring to a specific button, either an overlay (for overlay buttons), or a buffer-position or marker (for text property buttons). Such an object is passed as the first argument to a button’s invocation function when it is invoked.

Function: button-start button

Return the position at which button starts.

Function: button-end button

Return the position at which button ends.

Function: button-get button prop

Get the property of button button named prop.

Function: button-put button prop val

Set button’s prop property to val.

Function: button-activate button &optional use-mouse-action

Call button’s action property (i.e., invoke the function that is the value of that property, passing it the single argument button). If use-mouse-action is non-nil, try to invoke the button’s mouse-action property instead of action; if the button has no mouse-action property, use action as normal.

Function: button-label button

Return button’s text label.

Function: button-type button

Return button’s button-type.

Function: button-has-type-p button type

Return t if button has button-type type, or one of type’s subtypes.

Function: button-at pos

Return the button at position pos in the current buffer, or nil. If the button at pos is a text property button, the return value is a marker pointing to pos.

Function: button-type-put type prop val

Set the button-type type’s prop property to val.

Function: button-type-get type prop

Get the property of button-type type named prop.

Function: button-type-subtype-p type supertype

Return t if button-type type is a subtype of supertype.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.5 Button Buffer Commands

These are commands and functions for locating and operating on buttons in an Emacs buffer.

push-button is the command that a user uses to actually ‘push’ a button, and is bound by default in the button itself to RET and to mouse-2 using a local keymap in the button’s overlay or text properties. Commands that are useful outside the buttons itself, such as forward-button and backward-button are additionally available in the keymap stored in button-buffer-map; a mode which uses buttons may want to use button-buffer-map as a parent keymap for its keymap.

If the button has a non-nil follow-link property, and mouse-1-click-follows-link is set, a quick Mouse-1 click will also activate the push-button command. See section Defining Clickable Text.

Command: push-button &optional pos use-mouse-action

Perform the action specified by a button at location pos. pos may be either a buffer position or a mouse-event. If use-mouse-action is non-nil, or pos is a mouse-event (see section Mouse Events), try to invoke the button’s mouse-action property instead of action; if the button has no mouse-action property, use action as normal. pos defaults to point, except when push-button is invoked interactively as the result of a mouse-event, in which case, the mouse event’s position is used. If there’s no button at pos, do nothing and return nil, otherwise return t.

Command: forward-button n &optional wrap display-message

Move to the nth next button, or nth previous button if n is negative. If n is zero, move to the start of any button at point. If wrap is non-nil, moving past either end of the buffer continues from the other end. If display-message is non-nil, the button’s help-echo string is displayed. Any button with a non-nil skip property is skipped over. Returns the button found.

Command: backward-button n &optional wrap display-message

Move to the nth previous button, or nth next button if n is negative. If n is zero, move to the start of any button at point. If wrap is non-nil, moving past either end of the buffer continues from the other end. If display-message is non-nil, the button’s help-echo string is displayed. Any button with a non-nil skip property is skipped over. Returns the button found.

Function: next-button pos &optional count-current
Function: previous-button pos &optional count-current

Return the next button after (for next-button) or before (for previous-button) position pos in the current buffer. If count-current is non-nil, count any button at pos in the search, instead of starting at the next button.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.19 Abstract Display

The Ewoc package constructs buffer text that represents a structure of Lisp objects, and updates the text to follow changes in that structure. This is like the “view” component in the “model/view/controller” design paradigm. Ewoc means “Emacs’s Widget for Object Collections”.

An ewoc is a structure that organizes information required to construct buffer text that represents certain Lisp data. The buffer text of the ewoc has three parts, in order: first, fixed header text; next, textual descriptions of a series of data elements (Lisp objects that you specify); and last, fixed footer text. Specifically, an ewoc contains information on:

Typically, you define an ewoc with ewoc-create, and then pass the resulting ewoc structure to other functions in the Ewoc package to build nodes within it, and display it in the buffer. Once it is displayed in the buffer, other functions determine the correspondence between buffer positions and nodes, move point from one node’s textual representation to another, and so forth. See section Abstract Display Functions.

A node encapsulates a data element much the way a variable holds a value. Normally, encapsulation occurs as a part of adding a node to the ewoc. You can retrieve the data element value and place a new value in its place, like so:

(ewoc-data node)
⇒ value

(ewoc-set-data node new-value)
⇒ new-value

You can also use, as the data element value, a Lisp object (list or vector) that is a container for the “real” value, or an index into some other structure. The example (see section Abstract Display Example) uses the latter approach.

When the data changes, you will want to update the text in the buffer. You can update all nodes by calling ewoc-refresh, or just specific nodes using ewoc-invalidate, or all nodes satisfying a predicate using ewoc-map. Alternatively, you can delete invalid nodes using ewoc-delete or ewoc-filter, and add new nodes in their place. Deleting a node from an ewoc deletes its associated textual description from buffer, as well.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.19.1 Abstract Display Functions

In this subsection, ewoc and node stand for the structures described above (see section Abstract Display), while data stands for an arbitrary Lisp object used as a data element.

Function: ewoc-create pretty-printer &optional header footer nosep

This constructs and returns a new ewoc, with no nodes (and thus no data elements). pretty-printer should be a function that takes one argument, a data element of the sort you plan to use in this ewoc, and inserts its textual description at point using insert (and never insert-before-markers, because that would interfere with the Ewoc package’s internal mechanisms).

Normally, a newline is automatically inserted after the header, the footer and every node’s textual description. If nosep is non-nil, no newline is inserted. This may be useful for displaying an entire ewoc on a single line, for example, or for making nodes “invisible” by arranging for pretty-printer to do nothing for those nodes.

An ewoc maintains its text in the buffer that is current when you create it, so switch to the intended buffer before calling ewoc-create.

Function: ewoc-buffer ewoc

This returns the buffer where ewoc maintains its text.

Function: ewoc-get-hf ewoc

This returns a cons cell (header . footer) made from ewoc’s header and footer.

Function: ewoc-set-hf ewoc header footer

This sets the header and footer of ewoc to the strings header and footer, respectively.

Function: ewoc-enter-first ewoc data
Function: ewoc-enter-last ewoc data

These add a new node encapsulating data, putting it, respectively, at the beginning or end of ewoc’s chain of nodes.

Function: ewoc-enter-before ewoc node data
Function: ewoc-enter-after ewoc node data

These add a new node encapsulating data, adding it to ewoc before or after node, respectively.

Function: ewoc-prev ewoc node
Function: ewoc-next ewoc node

These return, respectively, the previous node and the next node of node in ewoc.

Function: ewoc-nth ewoc n

This returns the node in ewoc found at zero-based index n. A negative n means count from the end. ewoc-nth returns nil if n is out of range.

Function: ewoc-data node

This extracts the data encapsulated by node and returns it.

Function: ewoc-set-data node data

This sets the data encapsulated by node to data.

Function: ewoc-locate ewoc &optional pos guess

This determines the node in ewoc which contains point (or pos if specified), and returns that node. If ewoc has no nodes, it returns nil. If pos is before the first node, it returns the first node; if pos is after the last node, it returns the last node. The optional third arg guess should be a node that is likely to be near pos; this doesn’t alter the result, but makes the function run faster.

Function: ewoc-location node

This returns the start position of node.

Function: ewoc-goto-prev ewoc arg
Function: ewoc-goto-next ewoc arg

These move point to the previous or next, respectively, argth node in ewoc. ewoc-goto-prev does not move if it is already at the first node or if ewoc is empty, whereas ewoc-goto-next moves past the last node, returning nil. Excepting this special case, these functions return the node moved to.

Function: ewoc-goto-node ewoc node

This moves point to the start of node in ewoc.

Function: ewoc-refresh ewoc

This function regenerates the text of ewoc. It works by deleting the text between the header and the footer, i.e., all the data elements’ representations, and then calling the pretty-printer function for each node, one by one, in order.

Function: ewoc-invalidate ewoc &rest nodes

This is similar to ewoc-refresh, except that only nodes in ewoc are updated instead of the entire set.

Function: ewoc-delete ewoc &rest nodes

This deletes each node in nodes from ewoc.

Function: ewoc-filter ewoc predicate &rest args

This calls predicate for each data element in ewoc and deletes those nodes for which predicate returns nil. Any args are passed to predicate.

Function: ewoc-collect ewoc predicate &rest args

This calls predicate for each data element in ewoc and returns a list of those elements for which predicate returns non-nil. The elements in the list are ordered as in the buffer. Any args are passed to predicate.

Function: ewoc-map map-function ewoc &rest args

This calls map-function for each data element in ewoc and updates those nodes for which map-function returns non-nil. Any args are passed to map-function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.19.2 Abstract Display Example

Here is a simple example using functions of the ewoc package to implement a “color components display”, an area in a buffer that represents a vector of three integers (itself representing a 24-bit RGB value) in various ways.

(setq colorcomp-ewoc nil
      colorcomp-data nil
      colorcomp-mode-map nil
      colorcomp-labels ["Red" "Green" "Blue"])

(defun colorcomp-pp (data)
  (if data
      (let ((comp (aref colorcomp-data data)))
        (insert (aref colorcomp-labels data) "\t: #x"
                (format "%02X" comp) " "
                (make-string (ash comp -2) ?#) "\n"))
    (let ((cstr (format "#%02X%02X%02X"
                        (aref colorcomp-data 0)
                        (aref colorcomp-data 1)
                        (aref colorcomp-data 2)))
          (samp " (sample text) "))
      (insert "Color\t: "
              (propertize samp 'face
                          `(foreground-color . ,cstr))
              (propertize samp 'face
                          `(background-color . ,cstr))
              "\n"))))

(defun colorcomp (color)
  "Allow fiddling with COLOR in a new buffer.
The buffer is in Color Components mode."
  (interactive "sColor (name or #RGB or #RRGGBB): ")
  (when (string= "" color)
    (setq color "green"))
  (unless (color-values color)
    (error "No such color: %S" color))
  (switch-to-buffer
   (generate-new-buffer (format "originally: %s" color)))
  (kill-all-local-variables)
  (setq major-mode 'colorcomp-mode
        mode-name "Color Components")
  (use-local-map colorcomp-mode-map)
  (erase-buffer)
  (buffer-disable-undo)
  (let ((data (apply 'vector (mapcar (lambda (n) (ash n -8))
                                     (color-values color))))
        (ewoc (ewoc-create 'colorcomp-pp
                           "\nColor Components\n\n"
                           (substitute-command-keys
                            "\n\\{colorcomp-mode-map}"))))
    (set (make-local-variable 'colorcomp-data) data)
    (set (make-local-variable 'colorcomp-ewoc) ewoc)
    (ewoc-enter-last ewoc 0)
    (ewoc-enter-last ewoc 1)
    (ewoc-enter-last ewoc 2)
    (ewoc-enter-last ewoc nil)))

This example can be extended to be a “color selection widget” (in other words, the controller part of the “model/view/controller” design paradigm) by defining commands to modify colorcomp-data and to “finish” the selection process, and a keymap to tie it all together conveniently.

(defun colorcomp-mod (index limit delta)
  (let ((cur (aref colorcomp-data index)))
    (unless (= limit cur)
      (aset colorcomp-data index (+ cur delta)))
    (ewoc-invalidate
     colorcomp-ewoc
     (ewoc-nth colorcomp-ewoc index)
     (ewoc-nth colorcomp-ewoc -1))))

(defun colorcomp-R-more () (interactive) (colorcomp-mod 0 255 1))
(defun colorcomp-G-more () (interactive) (colorcomp-mod 1 255 1))
(defun colorcomp-B-more () (interactive) (colorcomp-mod 2 255 1))
(defun colorcomp-R-less () (interactive) (colorcomp-mod 0 0 -1))
(defun colorcomp-G-less () (interactive) (colorcomp-mod 1 0 -1))
(defun colorcomp-B-less () (interactive) (colorcomp-mod 2 0 -1))

(defun colorcomp-copy-as-kill-and-exit ()
  "Copy the color components into the kill ring and kill the buffer.
The string is formatted #RRGGBB (hash followed by six hex digits)."
  (interactive)
  (kill-new (format "#%02X%02X%02X"
                    (aref colorcomp-data 0)
                    (aref colorcomp-data 1)
                    (aref colorcomp-data 2)))
  (kill-buffer nil))

(setq colorcomp-mode-map
      (let ((m (make-sparse-keymap)))
        (suppress-keymap m)
        (define-key m "i" 'colorcomp-R-less)
        (define-key m "o" 'colorcomp-R-more)
        (define-key m "k" 'colorcomp-G-less)
        (define-key m "l" 'colorcomp-G-more)
        (define-key m "," 'colorcomp-B-less)
        (define-key m "." 'colorcomp-B-more)
        (define-key m " " 'colorcomp-copy-as-kill-and-exit)
        m))

Note that we never modify the data in each node, which is fixed when the ewoc is created to be either nil or an index into the vector colorcomp-data, the actual color components.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.20 Blinking Parentheses

This section describes the mechanism by which Emacs shows a matching open parenthesis when the user inserts a close parenthesis.

Variable: blink-paren-function

The value of this variable should be a function (of no arguments) to be called whenever a character with close parenthesis syntax is inserted. The value of blink-paren-function may be nil, in which case nothing is done.

User Option: blink-matching-paren

If this variable is nil, then blink-matching-open does nothing.

User Option: blink-matching-paren-distance

This variable specifies the maximum distance to scan for a matching parenthesis before giving up.

User Option: blink-matching-delay

This variable specifies the number of seconds to keep indicating the matching parenthesis. A fraction of a second often gives good results, but the default is 1, which works on all systems.

Command: blink-matching-open

This function is the default value of blink-paren-function. It assumes that point follows a character with close parenthesis syntax and applies the appropriate effect momentarily to the matching opening character. If that character is not already on the screen, it displays the character’s context in the echo area. To avoid long delays, this function does not search farther than blink-matching-paren-distance characters.

Here is an example of calling this function explicitly.

(defun interactive-blink-matching-open ()
  "Indicate momentarily the start of parenthesized sexp before point."
  (interactive)
  (let ((blink-matching-paren-distance
         (buffer-size))
        (blink-matching-paren t))
    (blink-matching-open)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21 Character Display

This section describes how characters are actually displayed by Emacs. Typically, a character is displayed as a glyph (a graphical symbol which occupies one character position on the screen), whose appearance corresponds to the character itself. For example, the character ‘a’ (character code 97) is displayed as ‘a’. Some characters, however, are displayed specially. For example, the formfeed character (character code 12) is usually displayed as a sequence of two glyphs, ‘^L’, while the newline character (character code 10) starts a new screen line.

You can modify how each character is displayed by defining a display table, which maps each character code into a sequence of glyphs. See section Display Tables.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.1 Usual Display Conventions

Here are the conventions for displaying each character code (in the absence of a display table, which can override these conventions; see section Display Tables).

The above display conventions apply even when there is a display table, for any character whose entry in the active display table is nil. Thus, when you set up a display table, you need only specify the characters for which you want special behavior.

The following variables affect how certain characters are displayed on the screen. Since they change the number of columns the characters occupy, they also affect the indentation functions. They also affect how the mode line is displayed; if you want to force redisplay of the mode line using the new values, call the function force-mode-line-update (see section Mode Line Format).

User Option: ctl-arrow

This buffer-local variable controls how control characters are displayed. If it is non-nil, they are displayed as a caret followed by the character: ‘^A’. If it is nil, they are displayed as octal escapes: a backslash followed by three octal digits, as in ‘\001’.

User Option: tab-width

The value of this buffer-local variable is the spacing between tab stops used for displaying tab characters in Emacs buffers. The value is in units of columns, and the default is 8. Note that this feature is completely independent of the user-settable tab stops used by the command tab-to-tab-stop. See section Adjustable “Tab Stops”.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.2 Display Tables

A display table is a special-purpose char-table (see section Char-Tables), with display-table as its subtype, which is used to override the usual character display conventions. This section describes how to make, inspect, and assign elements to a display table object.

Function: make-display-table

This creates and returns a display table. The table initially has nil in all elements.

The ordinary elements of the display table are indexed by character codes; the element at index c says how to display the character code c. The value should be nil (which means to display the character c according to the usual display conventions; see section Usual Display Conventions), or a vector of glyph codes (which means to display the character c as those glyphs; see section Glyphs).

Warning: if you use the display table to change the display of newline characters, the whole buffer will be displayed as one long “line”.

The display table also has six “extra slots” which serve special purposes. Here is a table of their meanings; nil in any slot means to use the default for that slot, as stated below.

0

The glyph for the end of a truncated screen line (the default for this is ‘$’). See section Glyphs. On graphical terminals, Emacs uses arrows in the fringes to indicate truncation, so the display table has no effect.

1

The glyph for the end of a continued line (the default is ‘\’). On graphical terminals, Emacs uses curved arrows in the fringes to indicate continuation, so the display table has no effect.

2

The glyph for indicating a character displayed as an octal character code (the default is ‘\’).

3

The glyph for indicating a control character (the default is ‘^’).

4

A vector of glyphs for indicating the presence of invisible lines (the default is ‘...’). See section Selective Display.

5

The glyph used to draw the border between side-by-side windows (the default is ‘|’). See section Splitting Windows. This takes effect only when there are no scroll bars; if scroll bars are supported and in use, a scroll bar separates the two windows.

For example, here is how to construct a display table that mimics the effect of setting ctl-arrow to a non-nil value (see section Glyphs, for the function make-glyph-code):

(setq disptab (make-display-table))
(dotimes (i 32)
  (or (= i ?\t)
      (= i ?\n)
      (aset disptab i
            (vector (make-glyph-code ?^ 'escape-glyph)
                    (make-glyph-code (+ i 64) 'escape-glyph)))))
(aset disptab 127
      (vector (make-glyph-code ?^ 'escape-glyph)
              (make-glyph-code ?? 'escape-glyph)))))
Function: display-table-slot display-table slot

This function returns the value of the extra slot slot of display-table. The argument slot may be a number from 0 to 5 inclusive, or a slot name (symbol). Valid symbols are truncation, wrap, escape, control, selective-display, and vertical-border.

Function: set-display-table-slot display-table slot value

This function stores value in the extra slot slot of display-table. The argument slot may be a number from 0 to 5 inclusive, or a slot name (symbol). Valid symbols are truncation, wrap, escape, control, selective-display, and vertical-border.

Function: describe-display-table display-table

This function displays a description of the display table display-table in a help buffer.

Command: describe-current-display-table

This command displays a description of the current display table in a help buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.3 Active Display Table

Each window can specify a display table, and so can each buffer. The window’s display table, if there is one, takes precedence over the buffer’s display table. If neither exists, Emacs tries to use the standard display table; if that is nil, Emacs uses the usual character display conventions (see section Usual Display Conventions).

Note that display tables affect how the mode line is displayed, so if you want to force redisplay of the mode line using a new display table, call force-mode-line-update (see section Mode Line Format).

Function: window-display-table &optional window

This function returns window’s display table, or nil if there is none. The default for window is the selected window.

Function: set-window-display-table window table

This function sets the display table of window to table. The argument table should be either a display table or nil.

Variable: buffer-display-table

This variable is automatically buffer-local in all buffers; its value specifies the buffer’s display table. If it is nil, there is no buffer display table.

Variable: standard-display-table

The value of this variable is the standard display table, which is used when Emacs is displaying a buffer in a window with neither a window display table nor a buffer display table defined. Its default is nil.

The disp-table library defines several functions for changing the standard display table.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.4 Glyphs

A glyph is a graphical symbol which occupies a single character position on the screen. Each glyph is represented in Lisp as a glyph code, which specifies a character and optionally a face to display it in (see section Faces). The main use of glyph codes is as the entries of display tables (see section Display Tables). The following functions are used to manipulate glyph codes:

Function: make-glyph-code char &optional face

This function returns a glyph code representing char char with face face. If face is omitted or nil, the glyph uses the default face; in that case, the glyph code is an integer. If face is non-nil, the glyph code is not necessarily an integer object.

Function: glyph-char glyph

This function returns the character of glyph code glyph.

Function: glyph-face glyph

This function returns face of glyph code glyph, or nil if glyph uses the default face.

You can set up a glyph table to change how glyph codes are actually displayed on text terminals. This feature is semi-obsolete; use glyphless-char-display instead (see section Glyphless Character Display).

Variable: glyph-table

The value of this variable, if non-nil, is the current glyph table. It takes effect only on character terminals; on graphical displays, all glyphs are displayed literally. The glyph table should be a vector whose gth element specifies how to display glyph code g, where g is the glyph code for a glyph whose face is unspecified. Each element should be one of the following:

nil

Display this glyph literally.

a string

Display this glyph by sending the specified string to the terminal.

a glyph code

Display the specified glyph code instead.

Any integer glyph code greater than or equal to the length of the glyph table is displayed literally.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.5 Glyphless Character Display

Glyphless characters are characters which are displayed in a special way, e.g., as a box containing a hexadecimal code, instead of being displayed literally. These include characters which are explicitly defined to be glyphless, as well as characters for which there is no available font (on a graphical display), and characters which cannot be encoded by the terminal’s coding system (on a text terminal).

Variable: glyphless-char-display

The value of this variable is a char-table which defines glyphless characters and how they are displayed. Each entry must be one of the following display methods:

nil

Display the character in the usual way.

zero-width

Don’t display the character.

thin-space

Display a thin space, 1-pixel wide on graphical displays, or 1-character wide on text terminals.

empty-box

Display an empty box.

hex-code

Display a box containing the Unicode codepoint of the character, in hexadecimal notation.

an ASCII string

Display a box containing that string.

a cons cell (graphical . text)

Display with graphical on graphical displays, and with text on text terminals. Both graphical and text must be one of the display methods described above.

The thin-space, empty-box, hex-code, and ASCII string display methods are drawn with the glyphless-char face.

The char-table has one extra slot, which determines how to display any character that cannot be displayed with any available font, or cannot be encoded by the terminal’s coding system. Its value should be one of the above display methods, except zero-width or a cons cell.

If a character has a non-nil entry in an active display table, the display table takes effect; in this case, Emacs does not consult glyphless-char-display at all.

User Option: glyphless-char-display-control

This user option provides a convenient way to set glyphless-char-display for groups of similar characters. Do not set its value directly from Lisp code; the value takes effect only via a custom :set function (see section Defining Customization Variables), which updates glyphless-char-display.

Its value should be an alist of elements (group . method), where group is a symbol specifying a group of characters, and method is a symbol specifying how to display them.

group should be one of the following:

c0-control

ASCII control characters U+0000 to U+001F, excluding the newline and tab characters (normally displayed as escape sequences like ‘^A’; see How Text Is Displayed in The GNU Emacs Manual).

c1-control

Non-ASCII, non-printing characters U+0080 to U+009F (normally displayed as octal escape sequences like ‘\230’).

format-control

Characters of Unicode General Category ‘Cf’, such as ‘U+200E’ (Left-to-Right Mark), but excluding characters that have graphic images, such as ‘U+00AD’ (Soft Hyphen).

no-font

Characters for there is no suitable font, or which cannot be encoded by the terminal’s coding system.

The method symbol should be one of zero-width, thin-space, empty-box, or hex-code. These have the same meanings as in glyphless-char-display, above.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.22 Beeping

This section describes how to make Emacs ring the bell (or blink the screen) to attract the user’s attention. Be conservative about how often you do this; frequent bells can become irritating. Also be careful not to use just beeping when signaling an error is more appropriate (see section Errors).

Function: ding &optional do-not-terminate

This function beeps, or flashes the screen (see visible-bell below). It also terminates any keyboard macro currently executing unless do-not-terminate is non-nil.

Function: beep &optional do-not-terminate

This is a synonym for ding.

User Option: visible-bell

This variable determines whether Emacs should flash the screen to represent a bell. Non-nil means yes, nil means no. This is effective on graphical displays, and on text terminals provided the terminal’s Termcap entry defines the visible bell capability (‘vb’).

Variable: ring-bell-function

If this is non-nil, it specifies how Emacs should “ring the bell”. Its value should be a function of no arguments. If this is non-nil, it takes precedence over the visible-bell variable.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.23 Window Systems

Emacs works with several window systems, most notably the X Window System. Both Emacs and X use the term “window”, but use it differently. An Emacs frame is a single window as far as X is concerned; the individual Emacs windows are not known to X at all.

Variable: window-system

This terminal-local variable tells Lisp programs what window system Emacs is using for displaying the frame. The possible values are

x

Emacs is displaying the frame using X.

w32

Emacs is displaying the frame using native MS-Windows GUI.

ns

Emacs is displaying the frame using the Nextstep interface (used on GNUstep and Mac OS X).

pc

Emacs is displaying the frame using MS-DOS direct screen writes.

nil

Emacs is displaying the frame on a character-based terminal.

Variable: initial-window-system

This variable holds the value of window-system used for the first frame created by Emacs during startup. (When Emacs is invoked with the --daemon option, it does not create any initial frames, so initial-window-system is nil. See daemon in The GNU Emacs Manual.)

Function: window-system &optional frame

This function returns a symbol whose name tells what window system is used for displaying frame (which defaults to the currently selected frame). The list of possible symbols it returns is the same one documented for the variable window-system above.

Do not use window-system and initial-window-system as predicates or boolean flag variables, if you want to write code that works differently on text terminals and graphic displays. That is because window-system is not a good indicator of Emacs capabilities on a given display type. Instead, use display-graphic-p or any of the other display-*-p predicates described in Display Feature Testing.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.24 Bidirectional Display

Emacs can display text written in scripts, such as Arabic, Farsi, and Hebrew, whose natural ordering for horizontal text display runs from right to left. Furthermore, segments of Latin script and digits embedded in right-to-left text are displayed left-to-right, while segments of right-to-left script embedded in left-to-right text (e.g., Arabic or Hebrew text in comments or strings in a program source file) are appropriately displayed right-to-left. We call such mixtures of left-to-right and right-to-left text bidirectional text. This section describes the facilities and options for editing and displaying bidirectional text.

Text is stored in Emacs buffers and strings in logical (or reading) order, i.e., the order in which a human would read each character. In right-to-left and bidirectional text, the order in which characters are displayed on the screen (called visual order) is not the same as logical order; the characters’ screen positions do not increase monotonically with string or buffer position. In performing this bidirectional reordering, Emacs follows the Unicode Bidirectional Algorithm (a.k.a. UBA), which is described in Annex #9 of the Unicode standard (http://www.unicode.org/reports/tr9/). Emacs currently provides a “Non-isolate Bidirectionality” class implementation of the UBA: it does not yet support the isolate directional formatting characters introduced with Unicode Standard v6.3.0.

Variable: bidi-display-reordering

If the value of this buffer-local variable is non-nil (the default), Emacs performs bidirectional reordering for display. The reordering affects buffer text, as well as display strings and overlay strings from text and overlay properties in the buffer (see section Overlay Properties, and see section The display Property). If the value is nil, Emacs does not perform bidirectional reordering in the buffer.

The default value of bidi-display-reordering controls the reordering of strings which are not directly supplied by a buffer, including the text displayed in mode lines (see section Mode Line Format) and header lines (see section Window Header Lines).

Emacs never reorders the text of a unibyte buffer, even if bidi-display-reordering is non-nil in the buffer. This is because unibyte buffers contain raw bytes, not characters, and thus lack the directionality properties required for reordering. Therefore, to test whether text in a buffer will be reordered for display, it is not enough to test the value of bidi-display-reordering alone. The correct test is this:

 (if (and enable-multibyte-characters
          bidi-display-reordering)
     ;; Buffer is being reordered for display
   )

However, unibyte display and overlay strings are reordered if their parent buffer is reordered. This is because plain-ASCII strings are stored by Emacs as unibyte strings. If a unibyte display or overlay string includes non-ASCII characters, these characters are assumed to have left-to-right direction.

Text covered by display text properties, by overlays with display properties whose value is a string, and by any other properties that replace buffer text, is treated as a single unit when it is reordered for display. That is, the entire chunk of text covered by these properties is reordered together. Moreover, the bidirectional properties of the characters in such a chunk of text are ignored, and Emacs reorders them as if they were replaced with a single character U+FFFC, known as the Object Replacement Character. This means that placing a display property over a portion of text may change the way that the surrounding text is reordered for display. To prevent this unexpected effect, always place such properties on text whose directionality is identical with text that surrounds it.

Each paragraph of bidirectional text has a base direction, either right-to-left or left-to-right. Left-to-right paragraphs are displayed beginning at the left margin of the window, and are truncated or continued when the text reaches the right margin. Right-to-left paragraphs are displayed beginning at the right margin, and are continued or truncated at the left margin.

By default, Emacs determines the base direction of each paragraph by looking at the text at its beginning. The precise method of determining the base direction is specified by the UBA; in a nutshell, the first character in a paragraph that has an explicit directionality determines the base direction of the paragraph. However, sometimes a buffer may need to force a certain base direction for its paragraphs. For example, buffers containing program source code should force all paragraphs to be displayed left-to-right. You can use following variable to do this:

Variable: bidi-paragraph-direction

If the value of this buffer-local variable is the symbol right-to-left or left-to-right, all paragraphs in the buffer are assumed to have that specified direction. Any other value is equivalent to nil (the default), which means to determine the base direction of each paragraph from its contents.

Modes for program source code should set this to left-to-right. Prog mode does this by default, so modes derived from Prog mode do not need to set this explicitly (see section Basic Major Modes).

Function: current-bidi-paragraph-direction &optional buffer

This function returns the paragraph direction at point in the named buffer. The returned value is a symbol, either left-to-right or right-to-left. If buffer is omitted or nil, it defaults to the current buffer. If the buffer-local value of the variable bidi-paragraph-direction is non-nil, the returned value will be identical to that value; otherwise, the returned value reflects the paragraph direction determined dynamically by Emacs. For buffers whose value of bidi-display-reordering is nil as well as unibyte buffers, this function always returns left-to-right.

Sometimes there’s a need to move point in strict visual order, either to the left or to the right of its current screen position. Emacs provides a primitive to do that.

Function: move-point-visually direction

This function moves point of the currently selected window to the buffer position that appears immediately to the right or to the left of point on the screen. If direction is positive, point will move one screen position to the right, otherwise it will move one screen position to the left. Note that, depending on the surrounding bidirectional context, this could potentially move point many buffer positions away. If invoked at the end of a screen line, the function moves point to the rightmost or leftmost screen position of the next or previous screen line, as appropriate for the value of direction.

The function returns the new buffer position as its value.

Bidirectional reordering can have surprising and unpleasant effects when two strings with bidirectional content are juxtaposed in a buffer, or otherwise programmatically concatenated into a string of text. A typical problematic case is when a buffer consists of sequences of text “fields” separated by whitespace or punctuation characters, like Buffer Menu mode or Rmail Summary Mode. Because the punctuation characters used as separators have weak directionality, they take on the directionality of surrounding text. As result, a numeric field that follows a field with bidirectional content can be displayed to the left of the preceding field, messing up the expected layout. There are several ways to avoid this problem:

Function: bidi-string-mark-left-to-right string

This function returns its argument string, possibly modified, such that the result can be safely concatenated with another string, or juxtaposed with another string in a buffer, without disrupting the relative layout of this string and the next one on display. If the string returned by this function is displayed as part of a left-to-right paragraph, it will always appear on display to the left of the text that follows it. The function works by examining the characters of its argument, and if any of those characters could cause reordering on display, the function appends the LRM character to the string. The appended LRM character is made invisible by giving it an invisible text property of t (see section Invisible Text).

The reordering algorithm uses the bidirectional properties of the characters stored as their bidi-class property (see section Character Properties). Lisp programs can change these properties by calling the put-char-code-property function. However, doing this requires a thorough understanding of the UBA, and is therefore not recommended. Any changes to the bidirectional properties of a character have global effect: they affect all Emacs frames and windows.

Similarly, the mirroring property is used to display the appropriate mirrored character in the reordered text. Lisp programs can affect the mirrored display by changing this property. Again, any such changes affect all of Emacs display.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38 Operating System Interface

This chapter is about starting and getting out of Emacs, access to values in the operating system environment, and terminal input, output.

See section Building Emacs, for related information. See section Emacs Display, for additional operating system status information pertaining to the terminal and the screen.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1 Starting Up Emacs

This section describes what Emacs does when it is started, and how you can customize these actions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1.1 Summary: Sequence of Actions at Startup

When Emacs is started up, it performs the following operations (see normal-top-level in startup.el):

  1. It adds subdirectories to load-path, by running the file named subdirs.el in each directory in the list. Normally, this file adds the directory’s subdirectories to the list, and those are scanned in their turn. The files subdirs.el are normally generated automatically when Emacs is installed.
  2. It loads any leim-list.el that it finds in the load-path directories. This file is intended for registering input methods. The search is only for any personal leim-list.el files that you may have created; it skips the directories containing the standard Emacs libraries (these should contain only a single leim-list.el file, which is compiled into the Emacs executable).
  3. It sets the variable before-init-time to the value of current-time (see section Time of Day). It also sets after-init-time to nil, which signals to Lisp programs that Emacs is being initialized.
  4. It sets the language environment and the terminal coding system, if requested by environment variables such as LANG.
  5. It does some basic parsing of the command-line arguments.
  6. If not running in batch mode, it initializes the window system that the variable initial-window-system specifies (see section initial-window-system). The initialization function for each supported window system is specified by window-system-initialization-alist. If the value of initial-window-system is windowsystem, then the appropriate initialization function is defined in the file term/windowsystem-win.el. This file should have been compiled into the Emacs executable when it was built.
  7. It runs the normal hook before-init-hook.
  8. If appropriate, it creates a graphical frame. This is not done if the options ‘--batch’ or ‘--daemon’ were specified.
  9. It initializes the initial frame’s faces, and sets up the menu bar and tool bar if needed. If graphical frames are supported, it sets up the tool bar even if the current frame is not a graphical one, since a graphical frame may be created later on.
  10. It use custom-reevaluate-setting to re-initialize the members of the list custom-delayed-init-variables. These are any pre-loaded user options whose default value depends on the run-time, rather than build-time, context. See section custom-initialize-delay.
  11. It loads the library site-start, if it exists. This is not done if the options ‘-Q’ or ‘--no-site-file’ were specified.
  12. It loads your init file (see section The Init File). This is not done if the options ‘-q’, ‘-Q’, or ‘--batch’ were specified. If the ‘-u’ option was specified, Emacs looks for the init file in that user’s home directory instead.
  13. It loads the library default, if it exists. This is not done if inhibit-default-init is non-nil, nor if the options ‘-q’, ‘-Q’, or ‘--batch’ were specified.
  14. It loads your abbrevs from the file specified by abbrev-file-name, if that file exists and can be read (see section abbrev-file-name). This is not done if the option ‘--batch’ was specified.
  15. If package-enable-at-startup is non-nil, it calls the function package-initialize to activate any optional Emacs Lisp package that has been installed. See section Packaging Basics.
  16. It sets the variable after-init-time to the value of current-time. This variable was set to nil earlier; setting it to the current time signals that the initialization phase is over, and, together with before-init-time, provides the measurement of how long it took.
  17. It runs the normal hook after-init-hook.
  18. If the buffer *scratch* exists and is still in Fundamental mode (as it should be by default), it sets its major mode according to initial-major-mode.
  19. If started on a text terminal, it loads the terminal-specific Lisp library (see section Terminal-Specific Initialization), and runs the hook tty-setup-hook. This is not done in --batch mode, nor if term-file-prefix is nil.
  20. It displays the initial echo area message, unless you have suppressed that with inhibit-startup-echo-area-message.
  21. It processes any command-line options that were not handled earlier.
  22. It now exits if the option --batch was specified.
  23. If initial-buffer-choice is a string, it visits the file (or directory) with that name. If it is a function, it calls the function with no arguments and selects the buffer that it returns. If the *scratch* buffer exists and is empty, it inserts initial-scratch-message into that buffer.
  24. It runs emacs-startup-hook.
  25. It calls frame-notice-user-settings, which modifies the parameters of the selected frame according to whatever the init files specify.
  26. It runs window-setup-hook. The only difference between this hook and emacs-startup-hook is that this one runs after the previously mentioned modifications to the frame parameters.
  27. It displays the startup screen, which is a special buffer that contains information about copyleft and basic Emacs usage. This is not done if inhibit-startup-screen or initial-buffer-choice are non-nil, or if the ‘--no-splash’ or ‘-Q’ command-line options were specified.
  28. If the option --daemon was specified, it calls server-start and detaches from the controlling terminal. See Emacs Server in The GNU Emacs Manual.
  29. If started by the X session manager, it calls emacs-session-restore passing it as argument the ID of the previous session. See section Session Management.

The following options affect some aspects of the startup sequence.

User Option: inhibit-startup-screen

This variable, if non-nil, inhibits the startup screen. In that case, Emacs typically displays the *scratch* buffer; but see initial-buffer-choice, below.

Do not set this variable in the init file of a new user, or in a way that affects more than one user, as that would prevent new users from receiving information about copyleft and basic Emacs usage.

inhibit-startup-message and inhibit-splash-screen are aliases for this variable.

User Option: initial-buffer-choice

If non-nil, this variable is a string that specifies a file or directory for Emacs to display after starting up, instead of the startup screen. If its value is a function, Emacs calls that function which must return a buffer which is then displayed. If its value is t, Emacs displays the *scratch* buffer.

User Option: inhibit-startup-echo-area-message

This variable controls the display of the startup echo area message. You can suppress the startup echo area message by adding text with this form to your init file:

(setq inhibit-startup-echo-area-message
      "your-login-name")

Emacs explicitly checks for an expression as shown above in your init file; your login name must appear in the expression as a Lisp string constant. You can also use the Customize interface. Other methods of setting inhibit-startup-echo-area-message to the same value do not inhibit the startup message. This way, you can easily inhibit the message for yourself if you wish, but thoughtless copying of your init file will not inhibit the message for someone else.

User Option: initial-scratch-message

This variable, if non-nil, should be a string, which is inserted into the *scratch* buffer when Emacs starts up. If it is nil, the *scratch* buffer is empty.

The following command-line options affect some aspects of the startup sequence. See Initial Options in The GNU Emacs Manual.

--no-splash

Do not display a splash screen.

--batch

Run without an interactive terminal. See section Batch Mode.

--daemon

Do not initialize any display; just start a server in the background.

--no-init-file
-q

Do not load either the init file, or the default library.

--no-site-file

Do not load the site-start library.

--quick
-Q

Equivalent to ‘-q --no-site-file --no-splash’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1.2 The Init File

When you start Emacs, it normally attempts to load your init file. This is either a file named .emacs or .emacs.el in your home directory, or a file named init.el in a subdirectory named .emacs.d in your home directory.

The command-line switches ‘-q’, ‘-Q’, and ‘-u’ control whether and where to find the init file; ‘-q’ (and the stronger ‘-Q’) says not to load an init file, while ‘-u user’ says to load user’s init file instead of yours. See Entering Emacs in The GNU Emacs Manual. If neither option is specified, Emacs uses the LOGNAME environment variable, or the USER (most systems) or USERNAME (MS systems) variable, to find your home directory and thus your init file; this way, even if you have su’d, Emacs still loads your own init file. If those environment variables are absent, though, Emacs uses your user-id to find your home directory.

An Emacs installation may have a default init file, which is a Lisp library named default.el. Emacs finds this file through the standard search path for libraries (see section How Programs Do Loading). The Emacs distribution does not come with this file; it is intended for local customizations. If the default init file exists, it is loaded whenever you start Emacs. But your own personal init file, if any, is loaded first; if it sets inhibit-default-init to a non-nil value, then Emacs does not subsequently load the default.el file. In batch mode, or if you specify ‘-q’ (or ‘-Q’), Emacs loads neither your personal init file nor the default init file.

Another file for site-customization is site-start.el. Emacs loads this before the user’s init file. You can inhibit the loading of this file with the option ‘--no-site-file’.

User Option: site-run-file

This variable specifies the site-customization file to load before the user’s init file. Its normal value is "site-start". The only way you can change it with real effect is to do so before dumping Emacs.

See Init File Examples in The GNU Emacs Manual, for examples of how to make various commonly desired customizations in your .emacs file.

User Option: inhibit-default-init

If this variable is non-nil, it prevents Emacs from loading the default initialization library file. The default value is nil.

Variable: before-init-hook

This normal hook is run, once, just before loading all the init files (site-start.el, your init file, and default.el). (The only way to change it with real effect is before dumping Emacs.)

Variable: after-init-hook

This normal hook is run, once, just after loading all the init files (site-start.el, your init file, and default.el), before loading the terminal-specific library (if started on a text terminal) and processing the command-line action arguments.

Variable: emacs-startup-hook

This normal hook is run, once, just after handling the command line arguments. In batch mode, Emacs does not run this hook.

Variable: window-setup-hook

This normal hook is very similar to emacs-startup-hook. The only difference is that it runs slightly later, after setting of the frame parameters. See section window-setup-hook.

Variable: user-init-file

This variable holds the absolute file name of the user’s init file. If the actual init file loaded is a compiled file, such as .emacs.elc, the value refers to the corresponding source file.

Variable: user-emacs-directory

This variable holds the name of the .emacs.d directory. It is ~/.emacs.d on all platforms but MS-DOS.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1.3 Terminal-Specific Initialization

Each terminal type can have its own Lisp library that Emacs loads when run on that type of terminal. The library’s name is constructed by concatenating the value of the variable term-file-prefix and the terminal type (specified by the environment variable TERM). Normally, term-file-prefix has the value "term/"; changing this is not recommended. Emacs finds the file in the normal manner, by searching the load-path directories, and trying the ‘.elc’ and ‘.el’ suffixes.

The usual role of a terminal-specific library is to enable special keys to send sequences that Emacs can recognize. It may also need to set or add to input-decode-map if the Termcap or Terminfo entry does not specify all the terminal’s function keys. See section Terminal Input.

When the name of the terminal type contains a hyphen or underscore, and no library is found whose name is identical to the terminal’s name, Emacs strips from the terminal’s name the last hyphen or underscore and everything that follows it, and tries again. This process is repeated until Emacs finds a matching library, or until there are no more hyphens or underscores in the name (i.e., there is no terminal-specific library). For example, if the terminal name is ‘xterm-256color’ and there is no term/xterm-256color.el library, Emacs tries to load term/xterm.el. If necessary, the terminal library can evaluate (getenv "TERM") to find the full name of the terminal type.

Your init file can prevent the loading of the terminal-specific library by setting the variable term-file-prefix to nil.

You can also arrange to override some of the actions of the terminal-specific library by using tty-setup-hook. This is a normal hook that Emacs runs after initializing a new text terminal. You could use this hook to define initializations for terminals that do not have their own libraries. See section Hooks.

Variable: term-file-prefix

If the value of this variable is non-nil, Emacs loads a terminal-specific initialization file as follows:

(load (concat term-file-prefix (getenv "TERM")))

You may set the term-file-prefix variable to nil in your init file if you do not wish to load the terminal-initialization file.

On MS-DOS, Emacs sets the TERM environment variable to ‘internal’.

Variable: tty-setup-hook

This variable is a normal hook that Emacs runs after initializing a new text terminal. (This applies when Emacs starts up in non-windowed mode, and when making a tty emacsclient connection.) The hook runs after loading your init file (if applicable) and the terminal-specific Lisp file, so you can use it to adjust the definitions made by that file.

For a related feature, see section window-setup-hook.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1.4 Command-Line Arguments

You can use command-line arguments to request various actions when you start Emacs. Note that the recommended way of using Emacs is to start it just once, after logging in, and then do all editing in the same Emacs session (see Entering Emacs in The GNU Emacs Manual). For this reason, you might not use command-line arguments very often; nonetheless, they can be useful when invoking Emacs from session scripts or debugging Emacs. This section describes how Emacs processes command-line arguments.

Function: command-line

This function parses the command line that Emacs was called with, processes it, and (amongst other things) loads the user’s init file and displays the startup messages.

Variable: command-line-processed

The value of this variable is t once the command line has been processed.

If you redump Emacs by calling dump-emacs (see section Building Emacs), you may wish to set this variable to nil first in order to cause the new dumped Emacs to process its new command-line arguments.

Variable: command-switch-alist

This variable is an alist of user-defined command-line options and associated handler functions. By default it is empty, but you can add elements if you wish.

A command-line option is an argument on the command line, which has the form:

-option

The elements of the command-switch-alist look like this:

(option . handler-function)

The CAR, option, is a string, the name of a command-line option (not including the initial hyphen). The handler-function is called to handle option, and receives the option name as its sole argument.

In some cases, the option is followed in the command line by an argument. In these cases, the handler-function can find all the remaining command-line arguments in the variable command-line-args-left (see below). (The entire list of command-line arguments is in command-line-args.)

The command-line arguments are parsed by the command-line-1 function in the startup.el file. See also Command Line Arguments for Emacs Invocation in The GNU Emacs Manual.

Variable: command-line-args

The value of this variable is the list of command-line arguments passed to Emacs.

Variable: command-line-args-left

The value of this variable is the list of command-line arguments that have not yet been processed.

Variable: command-line-functions

This variable’s value is a list of functions for handling an unrecognized command-line argument. Each time the next argument to be processed has no special meaning, the functions in this list are called, in order of appearance, until one of them returns a non-nil value.

These functions are called with no arguments. They can access the command-line argument under consideration through the variable argi, which is bound temporarily at this point. The remaining arguments (not including the current one) are in the variable command-line-args-left.

When a function recognizes and processes the argument in argi, it should return a non-nil value to say it has dealt with that argument. If it has also dealt with some of the following arguments, it can indicate that by deleting them from command-line-args-left.

If all of these functions return nil, then the argument is treated as a file name to visit.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.2 Getting Out of Emacs

There are two ways to get out of Emacs: you can kill the Emacs job, which exits permanently, or you can suspend it, which permits you to reenter the Emacs process later. (In a graphical environment, you can of course simply switch to another application without doing anything special to Emacs, then switch back to Emacs when you want.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.2.1 Killing Emacs

Killing Emacs means ending the execution of the Emacs process. If you started Emacs from a terminal, the parent process normally resumes control. The low-level primitive for killing Emacs is kill-emacs.

Command: kill-emacs &optional exit-data

This command calls the hook kill-emacs-hook, then exits the Emacs process and kills it.

If exit-data is an integer, that is used as the exit status of the Emacs process. (This is useful primarily in batch operation; see Batch Mode.)

If exit-data is a string, its contents are stuffed into the terminal input buffer so that the shell (or whatever program next reads input) can read them.

The kill-emacs function is normally called via the higher-level command C-x C-c (save-buffers-kill-terminal). See Exiting in The GNU Emacs Manual. It is also called automatically if Emacs receives a SIGTERM or SIGHUP operating system signal (e.g., when the controlling terminal is disconnected), or if it receives a SIGINT signal while running in batch mode (see section Batch Mode).

Variable: kill-emacs-hook

This normal hook is run by kill-emacs, before it kills Emacs.

Because kill-emacs can be called in situations where user interaction is impossible (e.g., when the terminal is disconnected), functions on this hook should not attempt to interact with the user. If you want to interact with the user when Emacs is shutting down, use kill-emacs-query-functions, described below.

When Emacs is killed, all the information in the Emacs process, aside from files that have been saved, is lost. Because killing Emacs inadvertently can lose a lot of work, the save-buffers-kill-terminal command queries for confirmation if you have buffers that need saving or subprocesses that are running. It also runs the abnormal hook kill-emacs-query-functions:

Variable: kill-emacs-query-functions

When save-buffers-kill-terminal is killing Emacs, it calls the functions in this hook, after asking the standard questions and before calling kill-emacs. The functions are called in order of appearance, with no arguments. Each function can ask for additional confirmation from the user. If any of them returns nil, save-buffers-kill-emacs does not kill Emacs, and does not run the remaining functions in this hook. Calling kill-emacs directly does not run this hook.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.2.2 Suspending Emacs

On text terminals, it is possible to suspend Emacs, which means stopping Emacs temporarily and returning control to its superior process, which is usually the shell. This allows you to resume editing later in the same Emacs process, with the same buffers, the same kill ring, the same undo history, and so on. To resume Emacs, use the appropriate command in the parent shell—most likely fg.

Suspending works only on a terminal device from which the Emacs session was started. We call that device the controlling terminal of the session. Suspending is not allowed if the controlling terminal is a graphical terminal. Suspending is usually not relevant in graphical environments, since you can simply switch to another application without doing anything special to Emacs.

Some operating systems (those without SIGTSTP, or MS-DOS) do not support suspension of jobs; on these systems, “suspension” actually creates a new shell temporarily as a subprocess of Emacs. Then you would exit the shell to return to Emacs.

Command: suspend-emacs &optional string

This function stops Emacs and returns control to the superior process. If and when the superior process resumes Emacs, suspend-emacs returns nil to its caller in Lisp.

This function works only on the controlling terminal of the Emacs session; to relinquish control of other tty devices, use suspend-tty (see below). If the Emacs session uses more than one terminal, you must delete the frames on all the other terminals before suspending Emacs, or this function signals an error. See section Multiple Terminals.

If string is non-nil, its characters are sent to Emacs’s superior shell, to be read as terminal input. The characters in string are not echoed by the superior shell; only the results appear.

Before suspending, suspend-emacs runs the normal hook suspend-hook. After the user resumes Emacs, suspend-emacs runs the normal hook suspend-resume-hook. See section Hooks.

The next redisplay after resumption will redraw the entire screen, unless the variable no-redraw-on-reenter is non-nil. See section Refreshing the Screen.

Here is an example of how you could use these hooks:

(add-hook 'suspend-hook
          (lambda () (or (y-or-n-p "Really suspend? ")
                         (error "Suspend canceled"))))
(add-hook 'suspend-resume-hook (lambda () (message "Resumed!")
                                 (sit-for 2)))

Here is what you would see upon evaluating (suspend-emacs "pwd"):

---------- Buffer: Minibuffer ----------
Really suspend? y
---------- Buffer: Minibuffer ----------
---------- Parent Shell ----------
bash$ /home/username
bash$ fg
---------- Echo Area ----------
Resumed!

Note that ‘pwd’ is not echoed after Emacs is suspended. But it is read and executed by the shell.

Variable: suspend-hook

This variable is a normal hook that Emacs runs before suspending.

Variable: suspend-resume-hook

This variable is a normal hook that Emacs runs on resuming after a suspension.

Function: suspend-tty &optional tty

If tty specifies a terminal device used by Emacs, this function relinquishes the device and restores it to its prior state. Frames that used the device continue to exist, but are not updated and Emacs doesn’t read input from them. tty can be a terminal object, a frame (meaning the terminal for that frame), or nil (meaning the terminal for the selected frame). See section Multiple Terminals.

If tty is already suspended, this function does nothing.

This function runs the hook suspend-tty-functions, passing the terminal object as an argument to each function.

Function: resume-tty &optional tty

This function resumes the previously suspended terminal device tty; where tty has the same possible values as it does for suspend-tty.

This function reopens the terminal device, re-initializes it, and redraws it with that terminal’s selected frame. It then runs the hook resume-tty-functions, passing the terminal object as an argument to each function.

If the same device is already used by another Emacs terminal, this function signals an error. If tty is not suspended, this function does nothing.

Function: controlling-tty-p &optional tty

This function returns non-nil if tty is the controlling terminal of the Emacs session; tty can be a terminal object, a frame (meaning the terminal for that frame), or nil (meaning the terminal for the selected frame).

Command: suspend-frame

This command suspends a frame. For GUI frames, it calls iconify-frame (see section Visibility of Frames); for frames on text terminals, it calls either suspend-emacs or suspend-tty, depending on whether the frame is displayed on the controlling terminal device or not.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.3 Operating System Environment

Emacs provides access to variables in the operating system environment through various functions. These variables include the name of the system, the user’s UID, and so on.

Variable: system-configuration

This variable holds the standard GNU configuration name for the hardware/software configuration of your system, as a string. For example, a typical value for a 64-bit GNU/Linux system is ‘"x86_64-unknown-linux-gnu"’.

Variable: system-type

The value of this variable is a symbol indicating the type of operating system Emacs is running on. The possible values are:

aix

IBM’s AIX.

berkeley-unix

Berkeley BSD and its variants.

cygwin

Cygwin, a Posix layer on top of MS-Windows.

darwin

Darwin (Mac OS X).

gnu

The GNU system (using the GNU kernel, which consists of the HURD and Mach).

gnu/linux

A GNU/Linux system—that is, a variant GNU system, using the Linux kernel. (These systems are the ones people often call “Linux”, but actually Linux is just the kernel, not the whole system.)

gnu/kfreebsd

A GNU (glibc-based) system with a FreeBSD kernel.

hpux

Hewlett-Packard HPUX operating system.

irix

Silicon Graphics Irix system.

ms-dos

Microsoft’s DOS. Emacs compiled with DJGPP for MS-DOS binds system-type to ms-dos even when you run it on MS-Windows.

usg-unix-v

AT&T Unix System V.

windows-nt

Microsoft Windows NT, 9X and later. The value of system-type is always windows-nt, e.g., even on Windows 7.

We do not wish to add new symbols to make finer distinctions unless it is absolutely necessary! In fact, we hope to eliminate some of these alternatives in the future. If you need to make a finer distinction than system-type allows for, you can test system-configuration, e.g., against a regexp.

Function: system-name

This function returns the name of the machine you are running on, as a string.

The symbol system-name is a variable as well as a function. In fact, the function returns whatever value the variable system-name currently holds. Thus, you can set the variable system-name in case Emacs is confused about the name of your system. The variable is also useful for constructing frame titles (see section Frame Titles).

User Option: mail-host-address

If this variable is non-nil, it is used instead of system-name for purposes of generating email addresses. For example, it is used when constructing the default value of user-mail-address. See section User Identification. (Since this is done when Emacs starts up, the value actually used is the one saved when Emacs was dumped. See section Building Emacs.)

Command: getenv var &optional frame

This function returns the value of the environment variable var, as a string. var should be a string. If var is undefined in the environment, getenv returns nil. It returns ‘""’ if var is set but null. Within Emacs, a list of environment variables and their values is kept in the variable process-environment.

(getenv "USER")
     ⇒ "lewis"

The shell command printenv prints all or part of the environment:

bash$ printenv
PATH=/usr/local/bin:/usr/bin:/bin
USER=lewis
TERM=xterm
SHELL=/bin/bash
HOME=/home/lewis
Command: setenv variable &optional value substitute

This command sets the value of the environment variable named variable to value. variable should be a string. Internally, Emacs Lisp can handle any string. However, normally variable should be a valid shell identifier, that is, a sequence of letters, digits and underscores, starting with a letter or underscore. Otherwise, errors may occur if subprocesses of Emacs try to access the value of variable. If value is omitted or nil (or, interactively, with a prefix argument), setenv removes variable from the environment. Otherwise, value should be a string.

If the optional argument substitute is non-nil, Emacs calls the function substitute-env-vars to expand any environment variables in value.

setenv works by modifying process-environment; binding that variable with let is also reasonable practice.

setenv returns the new value of variable, or nil if it removed variable from the environment.

Variable: process-environment

This variable is a list of strings, each describing one environment variable. The functions getenv and setenv work by means of this variable.

process-environment
⇒ ("PATH=/usr/local/bin:/usr/bin:/bin"
    "USER=lewis"
    "TERM=xterm"
    "SHELL=/bin/bash"
    "HOME=/home/lewis"
    …)

If process-environment contains “duplicate” elements that specify the same environment variable, the first of these elements specifies the variable, and the other “duplicates” are ignored.

Variable: initial-environment

This variable holds the list of environment variables Emacs inherited from its parent process when Emacs started.

Variable: path-separator

This variable holds a string that says which character separates directories in a search path (as found in an environment variable). Its value is ":" for Unix and GNU systems, and ";" for MS systems.

Function: parse-colon-path path

This function takes a search path string such as the value of the PATH environment variable, and splits it at the separators, returning a list of directory names. nil in this list means the current directory. Although the function’s name says “colon”, it actually uses the value of path-separator.

(parse-colon-path ":/foo:/bar")
     ⇒ (nil "/foo/" "/bar/")
Variable: invocation-name

This variable holds the program name under which Emacs was invoked. The value is a string, and does not include a directory name.

Variable: invocation-directory

This variable holds the directory from which the Emacs executable was invoked, or nil if that directory cannot be determined.

Variable: installation-directory

If non-nil, this is a directory within which to look for the lib-src and etc subdirectories. In an installed Emacs, it is normally nil. It is non-nil when Emacs can’t find those directories in their standard installed locations, but can find them in a directory related somehow to the one containing the Emacs executable (i.e., invocation-directory).

Function: load-average &optional use-float

This function returns the current 1-minute, 5-minute, and 15-minute system load averages, in a list. The load average indicates the number of processes trying to run on the system.

By default, the values are integers that are 100 times the system load averages, but if use-float is non-nil, then they are returned as floating-point numbers without multiplying by 100.

If it is impossible to obtain the load average, this function signals an error. On some platforms, access to load averages requires installing Emacs as setuid or setgid so that it can read kernel information, and that usually isn’t advisable.

If the 1-minute load average is available, but the 5- or 15-minute averages are not, this function returns a shortened list containing the available averages.

(load-average)
     ⇒ (169 48 36)
(load-average t)
     ⇒ (1.69 0.48 0.36)

The shell command uptime returns similar information.

Function: emacs-pid

This function returns the process ID of the Emacs process, as an integer.

Variable: tty-erase-char

This variable holds the erase character that was selected in the system’s terminal driver, before Emacs was started.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.4 User Identification

Variable: init-file-user

This variable says which user’s init files should be used by Emacs—or nil if none. "" stands for the user who originally logged in. The value reflects command-line options such as ‘-q’ or ‘-u user’.

Lisp packages that load files of customizations, or any other sort of user profile, should obey this variable in deciding where to find it. They should load the profile of the user name found in this variable. If init-file-user is nil, meaning that the ‘-q’, ‘-Q’, or ‘-batch’ option was used, then Lisp packages should not load any customization files or user profile.

User Option: user-mail-address

This holds the nominal email address of the user who is using Emacs. Emacs normally sets this variable to a default value after reading your init files, but not if you have already set it. So you can set the variable to some other value in your init file if you do not want to use the default value.

Function: user-login-name &optional uid

This function returns the name under which the user is logged in. It uses the environment variables LOGNAME or USER if either is set. Otherwise, the value is based on the effective UID, not the real UID.

If you specify uid (a number), the result is the user name that corresponds to uid, or nil if there is no such user.

Function: user-real-login-name

This function returns the user name corresponding to Emacs’s real UID. This ignores the effective UID, and the environment variables LOGNAME and USER.

Function: user-full-name &optional uid

This function returns the full name of the logged-in user—or the value of the environment variable NAME, if that is set.

If the Emacs process’s user-id does not correspond to any known user (and provided NAME is not set), the result is "unknown".

If uid is non-nil, then it should be a number (a user-id) or a string (a login name). Then user-full-name returns the full name corresponding to that user-id or login name. If you specify a user-id or login name that isn’t defined, it returns nil.

The symbols user-login-name, user-real-login-name and user-full-name are variables as well as functions. The functions return the same values that the variables hold. These variables allow you to “fake out” Emacs by telling the functions what to return. The variables are also useful for constructing frame titles (see section Frame Titles).

Function: user-real-uid

This function returns the real UID of the user. The value may be floating point, in the (unlikely) event that the UID is too large to fit in a Lisp integer.

Function: user-uid

This function returns the effective UID of the user. The value may be floating point.

Function: group-gid

This function returns the effective GID of the Emacs process. The value may be floating point.

Function: group-real-gid

This function returns the real GID of the Emacs process. The value may be floating point.

Function: system-users

This function returns a list of strings, listing the user names on the system. If Emacs cannot retrieve this information, the return value is a list containing just the value of user-real-login-name.

Function: system-groups

This function returns a list of strings, listing the names of user groups on the system. If Emacs cannot retrieve this information, the return value is nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.5 Time of Day

This section explains how to determine the current time and time zone.

Most of these functions represent time as a list of either four integers, (sec-high sec-low microsec picosec), or of three integers, (sec-high sec-low microsec), or of two integers, (sec-high sec-low). The integers sec-high and sec-low give the high and low bits of an integer number of seconds. This integer, high * 2**16 + low, is the number of seconds from the epoch (0:00 January 1, 1970 UTC) to the specified time. The third list element microsec, if present, gives the number of microseconds from the start of that second to the specified time. Similarly, the fourth list element picosec, if present, gives the number of picoseconds from the start of that microsecond to the specified time.

The return value of current-time represents time using four integers, as do the timestamps in the return value of file-attributes (see Definition of file-attributes). In function arguments, e.g., the time-value argument to current-time-string, two-, three-, and four-integer lists are accepted. You can convert times from the list representation into standard human-readable strings using current-time-string, or to other forms using the decode-time and format-time-string functions documented in the following sections.

Function: current-time-string &optional time-value

This function returns the current time and date as a human-readable string. The format does not vary for the initial part of the string, which contains the day of week, month, day of month, and time of day in that order: the number of characters used for these fields is always the same, so you can reliably use substring to extract them. You should count characters from the beginning of the string rather than from the end, as the year might not have exactly four digits, and additional information may some day be added at the end.

The argument time-value, if given, specifies a time to format (represented as a list of integers), instead of the current time.

(current-time-string)
     ⇒ "Wed Oct 14 22:21:05 1987"
Function: current-time

This function returns the current time, represented as a list of four integers (sec-high sec-low microsec picosec). These integers have trailing zeros on systems that return time with lower resolutions. On all current machines picosec is a multiple of 1000, but this may change as higher-resolution clocks become available.

Function: float-time &optional time-value

This function returns the current time as a floating-point number of seconds since the epoch. The optional argument time-value, if given, specifies a time (represented as a list of integers) to convert instead of the current time.

Warning: Since the result is floating point, it may not be exact. Do not use this function if precise time stamps are required.

Function: current-time-zone &optional time-value

This function returns a list describing the time zone that the user is in.

The value has the form (offset name). Here offset is an integer giving the number of seconds ahead of UTC (east of Greenwich). A negative value means west of Greenwich. The second element, name, is a string giving the name of the time zone. Both elements change when daylight saving time begins or ends; if the user has specified a time zone that does not use a seasonal time adjustment, then the value is constant through time.

If the operating system doesn’t supply all the information necessary to compute the value, the unknown elements of the list are nil.

The argument time-value, if given, specifies a time (represented as a list of integers) to analyze instead of the current time.

The current time zone is determined by the TZ environment variable. See section Operating System Environment. For example, you can tell Emacs to use universal time with (setenv "TZ" "UTC0"). If TZ is not in the environment, Emacs uses a platform-dependent default time zone.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.6 Time Conversion

These functions convert time values (lists of two to four integers, as explained in the previous section) into calendrical information and vice versa.

Many 32-bit operating systems are limited to time values containing 32 bits of information; these systems typically handle only the times from 1901-12-13 20:45:52 UTC through 2038-01-19 03:14:07 UTC. However, 64-bit and some 32-bit operating systems have larger time values, and can represent times far in the past or future.

Time conversion functions always use the Gregorian calendar, even for dates before the Gregorian calendar was introduced. Year numbers count the number of years since the year 1 B.C., and do not skip zero as traditional Gregorian years do; for example, the year number -37 represents the Gregorian year 38 B.C.

Function: decode-time &optional time

This function converts a time value into calendrical information. If you don’t specify time, it decodes the current time. The return value is a list of nine elements, as follows:

(seconds minutes hour day month year dow dst zone)

Here is what the elements mean:

seconds

The number of seconds past the minute, as an integer between 0 and 59. On some operating systems, this is 60 for leap seconds.

minutes

The number of minutes past the hour, as an integer between 0 and 59.

hour

The hour of the day, as an integer between 0 and 23.

day

The day of the month, as an integer between 1 and 31.

month

The month of the year, as an integer between 1 and 12.

year

The year, an integer typically greater than 1900.

dow

The day of week, as an integer between 0 and 6, where 0 stands for Sunday.

dst

t if daylight saving time is effect, otherwise nil.

zone

An integer indicating the time zone, as the number of seconds east of Greenwich.

Common Lisp Note: Common Lisp has different meanings for dow and zone.

Function: encode-time seconds minutes hour day month year &optional zone

This function is the inverse of decode-time. It converts seven items of calendrical data into a time value. For the meanings of the arguments, see the table above under decode-time.

Year numbers less than 100 are not treated specially. If you want them to stand for years above 1900, or years above 2000, you must alter them yourself before you call encode-time.

The optional argument zone defaults to the current time zone and its daylight saving time rules. If specified, it can be either a list (as you would get from current-time-zone), a string as in the TZ environment variable, t for Universal Time, or an integer (as you would get from decode-time). The specified zone is used without any further alteration for daylight saving time.

If you pass more than seven arguments to encode-time, the first six are used as seconds through year, the last argument is used as zone, and the arguments in between are ignored. This feature makes it possible to use the elements of a list returned by decode-time as the arguments to encode-time, like this:

(apply 'encode-time (decode-time …))

You can perform simple date arithmetic by using out-of-range values for the seconds, minutes, hour, day, and month arguments; for example, day 0 means the day preceding the given month.

The operating system puts limits on the range of possible time values; if you try to encode a time that is out of range, an error results. For instance, years before 1970 do not work on some systems; on others, years as early as 1901 do work.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.7 Parsing and Formatting Times

These functions convert time values to text in a string, and vice versa. Time values are lists of two to four integers (see section Time of Day).

Function: date-to-time string

This function parses the time-string string and returns the corresponding time value.

Function: format-time-string format-string &optional time universal

This function converts time (or the current time, if time is omitted) to a string according to format-string. The argument format-string may contain ‘%’-sequences which say to substitute parts of the time. Here is a table of what the ‘%’-sequences mean:

%a

This stands for the abbreviated name of the day of week.

%A

This stands for the full name of the day of week.

%b

This stands for the abbreviated name of the month.

%B

This stands for the full name of the month.

%c

This is a synonym for ‘%x %X’.

%C

This has a locale-specific meaning. In the default locale (named C), it is equivalent to ‘%A, %B %e, %Y’.

%d

This stands for the day of month, zero-padded.

%D

This is a synonym for ‘%m/%d/%y’.

%e

This stands for the day of month, blank-padded.

%h

This is a synonym for ‘%b’.

%H

This stands for the hour (00–23).

%I

This stands for the hour (01–12).

%j

This stands for the day of the year (001–366).

%k

This stands for the hour (0–23), blank padded.

%l

This stands for the hour (1–12), blank padded.

%m

This stands for the month (01–12).

%M

This stands for the minute (00–59).

%n

This stands for a newline.

%N

This stands for the nanoseconds (000000000–999999999). To ask for fewer digits, use ‘%3N’ for milliseconds, ‘%6N’ for microseconds, etc. Any excess digits are discarded, without rounding.

%p

This stands for ‘AM’ or ‘PM’, as appropriate.

%r

This is a synonym for ‘%I:%M:%S %p’.

%R

This is a synonym for ‘%H:%M’.

%S

This stands for the seconds (00–59).

%t

This stands for a tab character.

%T

This is a synonym for ‘%H:%M:%S’.

%U

This stands for the week of the year (01–52), assuming that weeks start on Sunday.

%w

This stands for the numeric day of week (0–6). Sunday is day 0.

%W

This stands for the week of the year (01–52), assuming that weeks start on Monday.

%x

This has a locale-specific meaning. In the default locale (named ‘C’), it is equivalent to ‘%D’.

%X

This has a locale-specific meaning. In the default locale (named ‘C’), it is equivalent to ‘%T’.

%y

This stands for the year without century (00–99).

%Y

This stands for the year with century.

%Z

This stands for the time zone abbreviation (e.g., ‘EST’).

%z

This stands for the time zone numerical offset (e.g., ‘-0500’).

You can also specify the field width and type of padding for any of these ‘%’-sequences. This works as in printf: you write the field width as digits in the middle of a ‘%’-sequences. If you start the field width with ‘0’, it means to pad with zeros. If you start the field width with ‘_’, it means to pad with spaces.

For example, ‘%S’ specifies the number of seconds since the minute; ‘%03S’ means to pad this with zeros to 3 positions, ‘%_3S’ to pad with spaces to 3 positions. Plain ‘%3S’ pads with zeros, because that is how ‘%S’ normally pads to two positions.

The characters ‘E’ and ‘O’ act as modifiers when used between ‘%’ and one of the letters in the table above. ‘E’ specifies using the current locale’s “alternative” version of the date and time. In a Japanese locale, for example, %Ex might yield a date format based on the Japanese Emperors’ reigns. ‘E’ is allowed in ‘%Ec’, ‘%EC’, ‘%Ex’, ‘%EX’, ‘%Ey’, and ‘%EY’.

O’ means to use the current locale’s “alternative” representation of numbers, instead of the ordinary decimal digits. This is allowed with most letters, all the ones that output numbers.

If universal is non-nil, that means to describe the time as Universal Time; nil means describe it using what Emacs believes is the local time zone (see current-time-zone).

This function uses the C library function strftime (see Formatting Calendar Time in The GNU C Library Reference Manual) to do most of the work. In order to communicate with that function, it first encodes its argument using the coding system specified by locale-coding-system (see section Locales); after strftime returns the resulting string, format-time-string decodes the string using that same coding system.

Function: seconds-to-time seconds

This function converts seconds, the number of seconds since the epoch, to a time value and returns that. To convert back, use float-time (see section Time of Day).

Function: format-seconds format-string seconds

This function converts its argument seconds into a string of years, days, hours, etc., according to format-string. The argument format-string may contain ‘%’-sequences which control the conversion. Here is a table of what the ‘%’-sequences mean:

%y
%Y

The integer number of 365-day years.

%d
%D

The integer number of days.

%h
%H

The integer number of hours.

%m
%M

The integer number of minutes.

%s
%S

The integer number of seconds.

%z

Non-printing control flag. When it is used, other specifiers must be given in the order of decreasing size, i.e., years before days, hours before minutes, etc. Nothing will be produced in the result string to the left of ‘%z’ until the first non-zero conversion is encountered. For example, the default format used by emacs-uptime (see section emacs-uptime) "%Y, %D, %H, %M, %z%S" means that the number of seconds will always be produced, but years, days, hours, and minutes will only be shown if they are non-zero.

%%

Produces a literal ‘%’.

Upper-case format sequences produce the units in addition to the numbers, lower-case formats produce only the numbers.

You can also specify the field width by following the ‘%’ with a number; shorter numbers will be padded with blanks. An optional period before the width requests zero-padding instead. For example, "%.3Y" might produce "004 years".

Warning: This function works only with values of seconds that don’t exceed most-positive-fixnum (see section most-positive-fixnum).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.8 Processor Run time

Emacs provides several functions and primitives that return time, both elapsed and processor time, used by the Emacs process.

Command: emacs-uptime &optional format

This function returns a string representing the Emacs uptime—the elapsed wall-clock time this instance of Emacs is running. The string is formatted by format-seconds according to the optional argument format. For the available format descriptors, see format-seconds. If format is nil or omitted, it defaults to "%Y, %D, %H, %M, %z%S".

When called interactively, it prints the uptime in the echo area.

Function: get-internal-run-time

This function returns the processor run time used by Emacs as a list of four integers: (high low microsec picosec), using the same format as current-time (see section Time of Day).

Note that the time returned by this function excludes the time Emacs was not using the processor, and if the Emacs process has several threads, the returned value is the sum of the processor times used up by all Emacs threads.

If the system doesn’t provide a way to determine the processor run time, get-internal-run-time returns the same time as current-time.

Command: emacs-init-time

This function returns the duration of the Emacs initialization (see section Summary: Sequence of Actions at Startup) in seconds, as a string. When called interactively, it prints the duration in the echo area.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.9 Time Calculations

These functions perform calendrical computations using time values (the kind of list that current-time returns).

Function: time-less-p t1 t2

This returns t if time value t1 is less than time value t2.

Function: time-subtract t1 t2

This returns the time difference t1 - t2 between two time values, in the same format as a time value.

Function: time-add t1 t2

This returns the sum of two time values, one of which ought to represent a time difference rather than a point in time. Here is how to add a number of seconds to a time value:

(time-add time (seconds-to-time seconds))
Function: time-to-days time

This function returns the number of days between the beginning of year 1 and time.

Function: time-to-day-in-year time

This returns the day number within the year corresponding to time.

Function: date-leap-year-p year

This function returns t if year is a leap year.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.10 Timers for Delayed Execution

You can set up a timer to call a function at a specified future time or after a certain length of idleness.

Emacs cannot run timers at any arbitrary point in a Lisp program; it can run them only when Emacs could accept output from a subprocess: namely, while waiting or inside certain primitive functions such as sit-for or read-event which can wait. Therefore, a timer’s execution may be delayed if Emacs is busy. However, the time of execution is very precise if Emacs is idle.

Emacs binds inhibit-quit to t before calling the timer function, because quitting out of many timer functions can leave things in an inconsistent state. This is normally unproblematical because most timer functions don’t do a lot of work. Indeed, for a timer to call a function that takes substantial time to run is likely to be annoying. If a timer function needs to allow quitting, it should use with-local-quit (see section Quitting). For example, if a timer function calls accept-process-output to receive output from an external process, that call should be wrapped inside with-local-quit, to ensure that C-g works if the external process hangs.

It is usually a bad idea for timer functions to alter buffer contents. When they do, they usually should call undo-boundary both before and after changing the buffer, to separate the timer’s changes from user commands’ changes and prevent a single undo entry from growing to be quite large.

Timer functions should also avoid calling functions that cause Emacs to wait, such as sit-for (see section Waiting for Elapsed Time or Input). This can lead to unpredictable effects, since other timers (or even the same timer) can run while waiting. If a timer function needs to perform an action after a certain time has elapsed, it can do this by scheduling a new timer.

If a timer function calls functions that can change the match data, it should save and restore the match data. See section Saving and Restoring the Match Data.

Command: run-at-time time repeat function &rest args

This sets up a timer that calls the function function with arguments args at time time. If repeat is a number (integer or floating point), the timer is scheduled to run again every repeat seconds after time. If repeat is nil, the timer runs only once.

time may specify an absolute or a relative time.

Absolute times may be specified using a string with a limited variety of formats, and are taken to be times today, even if already in the past. The recognized forms are ‘xxxx’, ‘x:xx’, or ‘xx:xx’ (military time), and ‘xxam’, ‘xxAM’, ‘xxpm’, ‘xxPM’, ‘xx:xxam’, ‘xx:xxAM’, ‘xx:xxpm’, or ‘xx:xxPM’. A period can be used instead of a colon to separate the hour and minute parts.

To specify a relative time as a string, use numbers followed by units. For example:

1 min

denotes 1 minute from now.

1 min 5 sec

denotes 65 seconds from now.

1 min 2 sec 3 hour 4 day 5 week 6 fortnight 7 month 8 year

denotes exactly 103 months, 123 days, and 10862 seconds from now.

For relative time values, Emacs considers a month to be exactly thirty days, and a year to be exactly 365.25 days.

Not all convenient formats are strings. If time is a number (integer or floating point), that specifies a relative time measured in seconds. The result of encode-time can also be used to specify an absolute value for time.

In most cases, repeat has no effect on when first call takes place—time alone specifies that. There is one exception: if time is t, then the timer runs whenever the time is a multiple of repeat seconds after the epoch. This is useful for functions like display-time.

The function run-at-time returns a timer value that identifies the particular scheduled future action. You can use this value to call cancel-timer (see below).

A repeating timer nominally ought to run every repeat seconds, but remember that any invocation of a timer can be late. Lateness of one repetition has no effect on the scheduled time of the next repetition. For instance, if Emacs is busy computing for long enough to cover three scheduled repetitions of the timer, and then starts to wait, it will immediately call the timer function three times in immediate succession (presuming no other timers trigger before or between them). If you want a timer to run again no less than n seconds after the last invocation, don’t use the repeat argument. Instead, the timer function should explicitly reschedule the timer.

User Option: timer-max-repeats

This variable’s value specifies the maximum number of times to repeat calling a timer function in a row, when many previously scheduled calls were unavoidably delayed.

Macro: with-timeout (seconds timeout-forms…) body…

Execute body, but give up after seconds seconds. If body finishes before the time is up, with-timeout returns the value of the last form in body. If, however, the execution of body is cut short by the timeout, then with-timeout executes all the timeout-forms and returns the value of the last of them.

This macro works by setting a timer to run after seconds seconds. If body finishes before that time, it cancels the timer. If the timer actually runs, it terminates execution of body, then executes timeout-forms.

Since timers can run within a Lisp program only when the program calls a primitive that can wait, with-timeout cannot stop executing body while it is in the midst of a computation—only when it calls one of those primitives. So use with-timeout only with a body that waits for input, not one that does a long computation.

The function y-or-n-p-with-timeout provides a simple way to use a timer to avoid waiting too long for an answer. See section Yes-or-No Queries.

Function: cancel-timer timer

This cancels the requested action for timer, which should be a timer—usually, one previously returned by run-at-time or run-with-idle-timer. This cancels the effect of that call to one of these functions; the arrival of the specified time will not cause anything special to happen.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.11 Idle Timers

Here is how to set up a timer that runs when Emacs is idle for a certain length of time. Aside from how to set them up, idle timers work just like ordinary timers.

Command: run-with-idle-timer secs repeat function &rest args

Set up a timer which runs the next time Emacs is idle for secs seconds. The value of secs may be a number or a value of the type returned by current-idle-time.

If repeat is nil, the timer runs just once, the first time Emacs remains idle for a long enough time. More often repeat is non-nil, which means to run the timer each time Emacs remains idle for secs seconds.

The function run-with-idle-timer returns a timer value which you can use in calling cancel-timer (see section Timers for Delayed Execution).

Emacs becomes idle when it starts waiting for user input, and it remains idle until the user provides some input. If a timer is set for five seconds of idleness, it runs approximately five seconds after Emacs first becomes idle. Even if repeat is non-nil, this timer will not run again as long as Emacs remains idle, because the duration of idleness will continue to increase and will not go down to five seconds again.

Emacs can do various things while idle: garbage collect, autosave or handle data from a subprocess. But these interludes during idleness do not interfere with idle timers, because they do not reset the clock of idleness to zero. An idle timer set for 600 seconds will run when ten minutes have elapsed since the last user command was finished, even if subprocess output has been accepted thousands of times within those ten minutes, and even if there have been garbage collections and autosaves.

When the user supplies input, Emacs becomes non-idle while executing the input. Then it becomes idle again, and all the idle timers that are set up to repeat will subsequently run another time, one by one.

Do not write an idle timer function containing a loop which does a certain amount of processing each time around, and exits when (input-pending-p) is non-nil. This approach seems very natural but has two problems:

Similarly, do not write an idle timer function that sets up another idle timer (including the same idle timer) with secs argument less than or equal to the current idleness time. Such a timer will run almost immediately, and continue running again and again, instead of waiting for the next time Emacs becomes idle. The correct approach is to reschedule with an appropriate increment of the current value of the idleness time, as described below.

Function: current-idle-time

If Emacs is idle, this function returns the length of time Emacs has been idle, as a list of four integers: (sec-high sec-low microsec picosec), using the same format as current-time (see section Time of Day).

When Emacs is not idle, current-idle-time returns nil. This is a convenient way to test whether Emacs is idle.

The main use of current-idle-time is when an idle timer function wants to “take a break” for a while. It can set up another idle timer to call the same function again, after a few seconds more idleness. Here’s an example:

(defvar my-resume-timer nil
  "Timer for `my-timer-function' to reschedule itself, or nil.")

(defun my-timer-function ()
  ;; If the user types a command while my-resume-timer
  ;; is active, the next time this function is called from
  ;; its main idle timer, deactivate my-resume-timer.
  (when my-resume-timer
    (cancel-timer my-resume-timer))
  ...do the work for a while...
  (when taking-a-break
    (setq my-resume-timer
          (run-with-idle-timer
            ;; Compute an idle time break-length
            ;; more than the current value.
            (time-add (current-idle-time)
                      (seconds-to-time break-length))
            nil
            'my-timer-function))))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.12 Terminal Input

This section describes functions and variables for recording or manipulating terminal input. See Emacs Display, for related functions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.12.1 Input Modes

Function: set-input-mode interrupt flow meta &optional quit-char

This function sets the mode for reading keyboard input. If interrupt is non-nil, then Emacs uses input interrupts. If it is nil, then it uses CBREAK mode. The default setting is system-dependent. Some systems always use CBREAK mode regardless of what is specified.

When Emacs communicates directly with X, it ignores this argument and uses interrupts if that is the way it knows how to communicate.

If flow is non-nil, then Emacs uses XON/XOFF (C-q, C-s) flow control for output to the terminal. This has no effect except in CBREAK mode.

The argument meta controls support for input character codes above 127. If meta is t, Emacs converts characters with the 8th bit set into Meta characters. If meta is nil, Emacs disregards the 8th bit; this is necessary when the terminal uses it as a parity bit. If meta is neither t nor nil, Emacs uses all 8 bits of input unchanged. This is good for terminals that use 8-bit character sets.

If quit-char is non-nil, it specifies the character to use for quitting. Normally this character is C-g. See section Quitting.

The current-input-mode function returns the input mode settings Emacs is currently using.

Function: current-input-mode

This function returns the current mode for reading keyboard input. It returns a list, corresponding to the arguments of set-input-mode, of the form (interrupt flow meta quit) in which:

interrupt

is non-nil when Emacs is using interrupt-driven input. If nil, Emacs is using CBREAK mode.

flow

is non-nil if Emacs uses XON/XOFF (C-q, C-s) flow control for output to the terminal. This value is meaningful only when interrupt is nil.

meta

is t if Emacs treats the eighth bit of input characters as the meta bit; nil means Emacs clears the eighth bit of every input character; any other value means Emacs uses all eight bits as the basic character code.

quit

is the character Emacs currently uses for quitting, usually C-g.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.12.2 Recording Input

Function: recent-keys

This function returns a vector containing the last 300 input events from the keyboard or mouse. All input events are included, whether or not they were used as parts of key sequences. Thus, you always get the last 300 input events, not counting events generated by keyboard macros. (These are excluded because they are less interesting for debugging; it should be enough to see the events that invoked the macros.)

A call to clear-this-command-keys (see section Information from the Command Loop) causes this function to return an empty vector immediately afterward.

Command: open-dribble-file filename

This function opens a dribble file named filename. When a dribble file is open, each input event from the keyboard or mouse (but not those from keyboard macros) is written in that file. A non-character event is expressed using its printed representation surrounded by ‘<…>’. Be aware that sensitive information (such as passwords) may end up recorded in the dribble file.

You close the dribble file by calling this function with an argument of nil.

See also the open-termscript function (see section Terminal Output).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.13 Terminal Output

The terminal output functions send output to a text terminal, or keep track of output sent to the terminal. The variable baud-rate tells you what Emacs thinks is the output speed of the terminal.

User Option: baud-rate

This variable’s value is the output speed of the terminal, as far as Emacs knows. Setting this variable does not change the speed of actual data transmission, but the value is used for calculations such as padding.

It also affects decisions about whether to scroll part of the screen or repaint on text terminals. See section Forcing Redisplay, for the corresponding functionality on graphical terminals.

The value is measured in baud.

If you are running across a network, and different parts of the network work at different baud rates, the value returned by Emacs may be different from the value used by your local terminal. Some network protocols communicate the local terminal speed to the remote machine, so that Emacs and other programs can get the proper value, but others do not. If Emacs has the wrong value, it makes decisions that are less than optimal. To fix the problem, set baud-rate.

Function: send-string-to-terminal string &optional terminal

This function sends string to terminal without alteration. Control characters in string have terminal-dependent effects. This function operates only on text terminals. terminal may be a terminal object, a frame, or nil for the selected frame’s terminal. In batch mode, string is sent to stdout when terminal is nil.

One use of this function is to define function keys on terminals that have downloadable function key definitions. For example, this is how (on certain terminals) to define function key 4 to move forward four characters (by transmitting the characters C-u C-f to the computer):

(send-string-to-terminal "\eF4\^U\^F")
     ⇒ nil
Command: open-termscript filename

This function is used to open a termscript file that will record all the characters sent by Emacs to the terminal. It returns nil. Termscript files are useful for investigating problems where Emacs garbles the screen, problems that are due to incorrect Termcap entries or to undesirable settings of terminal options more often than to actual Emacs bugs. Once you are certain which characters were actually output, you can determine reliably whether they correspond to the Termcap specifications in use.

(open-termscript "../junk/termscript")
     ⇒ nil

You close the termscript file by calling this function with an argument of nil.

See also open-dribble-file in Recording Input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.14 Sound Output

To play sound using Emacs, use the function play-sound. Only certain systems are supported; if you call play-sound on a system which cannot really do the job, it gives an error.

The sound must be stored as a file in RIFF-WAVE format (‘.wav’) or Sun Audio format (‘.au’).

Function: play-sound sound

This function plays a specified sound. The argument, sound, has the form (sound properties...), where the properties consist of alternating keywords (particular symbols recognized specially) and values corresponding to them.

Here is a table of the keywords that are currently meaningful in sound, and their meanings:

:file file

This specifies the file containing the sound to play. If the file name is not absolute, it is expanded against the directory data-directory.

:data data

This specifies the sound to play without need to refer to a file. The value, data, should be a string containing the same bytes as a sound file. We recommend using a unibyte string.

:volume volume

This specifies how loud to play the sound. It should be a number in the range of 0 to 1. The default is to use whatever volume has been specified before.

:device device

This specifies the system device on which to play the sound, as a string. The default device is system-dependent.

Before actually playing the sound, play-sound calls the functions in the list play-sound-functions. Each function is called with one argument, sound.

Command: play-sound-file file &optional volume device

This function is an alternative interface to playing a sound file specifying an optional volume and device.

Variable: play-sound-functions

A list of functions to be called before playing a sound. Each function is called with one argument, a property list that describes the sound.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.15 Operating on X11 Keysyms

To define system-specific X11 keysyms, set the variable system-key-alist.

Variable: system-key-alist

This variable’s value should be an alist with one element for each system-specific keysym. Each element has the form (code . symbol), where code is the numeric keysym code (not including the “vendor specific” bit, -2**28), and symbol is the name for the function key.

For example (168 . mute-acute) defines a system-specific key (used by HP X servers) whose numeric code is -2**28 + 168.

It is not crucial to exclude from the alist the keysyms of other X servers; those do no harm, as long as they don’t conflict with the ones used by the X server actually in use.

The variable is always local to the current terminal, and cannot be buffer-local. See section Multiple Terminals.

You can specify which keysyms Emacs should use for the Meta, Alt, Hyper, and Super modifiers by setting these variables:

Variable: x-alt-keysym
Variable: x-meta-keysym
Variable: x-hyper-keysym
Variable: x-super-keysym

The name of the keysym that should stand for the Alt modifier (respectively, for Meta, Hyper, and Super). For example, here is how to swap the Meta and Alt modifiers within Emacs:

(setq x-alt-keysym 'meta)
(setq x-meta-keysym 'alt)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.16 Batch Mode

The command-line option ‘-batch’ causes Emacs to run noninteractively. In this mode, Emacs does not read commands from the terminal, it does not alter the terminal modes, and it does not expect to be outputting to an erasable screen. The idea is that you specify Lisp programs to run; when they are finished, Emacs should exit. The way to specify the programs to run is with ‘-l file’, which loads the library named file, or ‘-f function’, which calls function with no arguments, or ‘--eval form’.

Any Lisp program output that would normally go to the echo area, either using message, or using prin1, etc., with t as the stream, goes instead to Emacs’s standard error descriptor when in batch mode. Similarly, input that would normally come from the minibuffer is read from the standard input descriptor. Thus, Emacs behaves much like a noninteractive application program. (The echo area output that Emacs itself normally generates, such as command echoing, is suppressed entirely.)

Variable: noninteractive

This variable is non-nil when Emacs is running in batch mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.17 Session Management

Emacs supports the X Session Management Protocol, which is used to suspend and restart applications. In the X Window System, a program called the session manager is responsible for keeping track of the applications that are running. When the X server shuts down, the session manager asks applications to save their state, and delays the actual shutdown until they respond. An application can also cancel the shutdown.

When the session manager restarts a suspended session, it directs these applications to individually reload their saved state. It does this by specifying a special command-line argument that says what saved session to restore. For Emacs, this argument is ‘--smid session’.

Variable: emacs-save-session-functions

Emacs supports saving state via a hook called emacs-save-session-functions. Emacs runs this hook when the session manager tells it that the window system is shutting down. The functions are called with no arguments, and with the current buffer set to a temporary buffer. Each function can use insert to add Lisp code to this buffer. At the end, Emacs saves the buffer in a file, called the session file.

Subsequently, when the session manager restarts Emacs, it loads the session file automatically (see section Loading). This is performed by a function named emacs-session-restore, which is called during startup. See section Summary: Sequence of Actions at Startup.

If a function in emacs-save-session-functions returns non-nil, Emacs tells the session manager to cancel the shutdown.

Here is an example that just inserts some text into *scratch* when Emacs is restarted by the session manager.

(add-hook 'emacs-save-session-functions 'save-yourself-test)
(defun save-yourself-test ()
  (insert "(save-current-buffer
  (switch-to-buffer \"*scratch*\")
  (insert \"I am restored\"))")
  nil)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.18 Desktop Notifications

Emacs is able to send notifications on systems that support the freedesktop.org Desktop Notifications Specification. In order to use this functionality, Emacs must have been compiled with D-Bus support, and the notifications library must be loaded. See D-Bus in D-Bus integration in Emacs.

Function: notifications-notify &rest params

This function sends a notification to the desktop via D-Bus, consisting of the parameters specified by the params arguments. These arguments should consist of alternating keyword and value pairs. The supported keywords and values are as follows:

:bus bus

The D-Bus bus. This argument is needed only if a bus other than :session shall be used.

:title title

The notification title.

:body text

The notification body text. Depending on the implementation of the notification server, the text could contain HTML markups, like ‘"<b>bold text</b>"’, hyperlinks, or images. Special HTML characters must be encoded, as ‘"Contact &lt;postmaster@localhost&gt;!"’.

:app-name name

The name of the application sending the notification. The default is notifications-application-name.

:replaces-id id

The notification id that this notification replaces. id must be the result of a previous notifications-notify call.

:app-icon icon-file

The file name of the notification icon. If set to nil, no icon is displayed. The default is notifications-application-icon.

:actions (key title key title ...)

A list of actions to be applied. key and title are both strings. The default action (usually invoked by clicking the notification) should have a key named ‘"default"’. The title can be anything, though implementations are free not to display it.

:timeout timeout

The timeout time in milliseconds since the display of the notification at which the notification should automatically close. If -1, the notification’s expiration time is dependent on the notification server’s settings, and may vary for the type of notification. If 0, the notification never expires. Default value is -1.

:urgency urgency

The urgency level. It can be low, normal, or critical.

:action-items

When this keyword is given, the title string of the actions is interpreted as icon name.

:category category

The type of notification this is, a string. See the Desktop Notifications Specification for a list of standard categories.

:desktop-entry filename

This specifies the name of the desktop filename representing the calling program, like ‘"emacs"’.

:image-data (width height rowstride has-alpha bits channels data)

This is a raw data image format that describes the width, height, rowstride, whether there is an alpha channel, bits per sample, channels and image data, respectively.

:image-path path

This is represented either as a URI (‘file://’ is the only URI schema supported right now) or a name in a freedesktop.org-compliant icon theme from ‘$XDG_DATA_DIRS/icons’.

:sound-file filename

The path to a sound file to play when the notification pops up.

:sound-name name

A themable named sound from the freedesktop.org sound naming specification from ‘$XDG_DATA_DIRS/sounds’, to play when the notification pops up. Similar to the icon name, only for sounds. An example would be ‘"message-new-instant"’.

:suppress-sound

Causes the server to suppress playing any sounds, if it has that ability.

:resident

When set the server will not automatically remove the notification when an action has been invoked. The notification will remain resident in the server until it is explicitly removed by the user or by the sender. This hint is likely only useful when the server has the :persistence capability.

:transient

When set the server will treat the notification as transient and by-pass the server’s persistence capability, if it should exist.

:x position
:y position

Specifies the X, Y location on the screen that the notification should point to. Both arguments must be used together.

:on-action function

Function to call when an action is invoked. The notification id and the key of the action are passed as arguments to the function.

:on-close function

Function to call when the notification has been closed by timeout or by the user. The function receive the notification id and the closing reason as arguments:

  • expired if the notification has expired
  • dismissed if the notification was dismissed by the user
  • close-notification if the notification was closed by a call to notifications-close-notification
  • undefined if the notification server hasn’t provided a reason

Which parameters are accepted by the notification server can be checked via notifications-get-capabilities.

This function returns a notification id, an integer, which can be used to manipulate the notification item with notifications-close-notification or the :replaces-id argument of another notifications-notify call. For example:

(defun my-on-action-function (id key)
  (message "Message %d, key \"%s\" pressed" id key))
     ⇒ my-on-action-function
(defun my-on-close-function (id reason)
  (message "Message %d, closed due to \"%s\"" id reason))
     ⇒ my-on-close-function
(notifications-notify
 :title "Title"
 :body "This is <b>important</b>."
 :actions '("Confirm" "I agree" "Refuse" "I disagree")
 :on-action 'my-on-action-function
 :on-close 'my-on-close-function)
     ⇒ 22
A message window opens on the desktop.  Press "I agree"
     ⇒ Message 22, key "Confirm" pressed
        Message 22, closed due to "dismissed"
Function: notifications-close-notification id &optional bus

This function closes a notification with identifier id. bus can be a string denoting a D-Bus connection, the default is :session.

Function: notifications-get-capabilities &optional bus

Returns the capabilities of the notification server, a list of symbols. bus can be a string denoting a D-Bus connection, the default is :session. The following capabilities can be expected:

:actions

The server will provide the specified actions to the user.

:body

Supports body text.

:body-hyperlinks

The server supports hyperlinks in the notifications.

:body-images

The server supports images in the notifications.

:body-markup

Supports markup in the body text.

:icon-multi

The server will render an animation of all the frames in a given image array.

:icon-static

Supports display of exactly 1 frame of any given image array. This value is mutually exclusive with :icon-multi.

:persistence

The server supports persistence of notifications.

:sound

The server supports sounds on notifications.

Further vendor-specific caps start with :x-vendor, like :x-gnome-foo-cap.

Function: notifications-get-server-information &optional bus

Return information on the notification server, a list of strings. bus can be a string denoting a D-Bus connection, the default is :session. The returned list is (name vendor version spec-version).

name

The product name of the server.

vendor

The vendor name. For example, ‘"KDE"’, ‘"GNOME"’.

version

The server’s version number.

spec-version

The specification version the server is compliant with.

If spec_version is nil, the server supports a specification prior to ‘"1.0"’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.19 Notifications on File Changes

Several operating systems support watching of filesystems for changes of files. If configured properly, Emacs links a respective library like gfilenotify, inotify, or w32notify statically. These libraries enable watching of filesystems on the local machine.

It is also possible to watch filesystems on remote machines, see Remote Files in The GNU Emacs Manual This does not depend on one of the libraries linked to Emacs.

Since all these libraries emit different events on notified file changes, there is the Emacs library filenotify which provides a unique interface.

Function: file-notify-add-watch file flags callback

Add a watch for filesystem events pertaining to file. This arranges for filesystem events pertaining to file to be reported to Emacs.

The returned value is a descriptor for the added watch. Its type depends on the underlying library, it cannot be assumed to be an integer as in the example below. It should be used for comparison by equal only.

If the file cannot be watched for some reason, this function signals a file-notify-error error.

Sometimes, mounted filesystems cannot be watched for file changes. This is not detected by this function, a non-nil return value does not guarantee that changes on file will be notified.

flags is a list of conditions to set what will be watched for. It can include the following symbols:

change

watch for file changes

attribute-change

watch for file attribute changes, like permissions or modification time

If file is a directory, changes for all files in that directory will be notified. This does not work recursively.

When any event happens, Emacs will call the callback function passing it a single argument event, which is of the form

(descriptor action file [file1])

descriptor is the same object as the one returned by this function. action is the description of the event. It could be any one of the following symbols:

created

file was created

deleted

file was deleted

changed

file has changed

renamed

file has been renamed to file1

attribute-changed

a file attribute was changed

file and file1 are the name of the file(s) whose event is being reported. For example:

(require 'filenotify)
     ⇒ filenotify
(defun my-notify-callback (event)
  (message "Event %S" event))
     ⇒ my-notify-callback
(file-notify-add-watch
  "/tmp" '(change attribute-change) 'my-notify-callback)
     ⇒ 35025468
(write-region "foo" nil "/tmp/foo")
     ⇒ Event (35025468 created "/tmp/.#foo")
        Event (35025468 created "/tmp/foo")
        Event (35025468 changed "/tmp/foo")
        Event (35025468 deleted "/tmp/.#foo")
(write-region "bla" nil "/tmp/foo")
     ⇒ Event (35025468 created "/tmp/.#foo")
        Event (35025468 changed "/tmp/foo") [2 times]
        Event (35025468 deleted "/tmp/.#foo")
(set-file-modes "/tmp/foo" (default-file-modes))
     ⇒ Event (35025468 attribute-changed "/tmp/foo")

Whether the action renamed is returned, depends on the used watch library. It can be expected, when a directory is watched, and both file and file1 belong to this directory. Otherwise, the actions deleted and created could be returned in a random order.

(rename-file "/tmp/foo" "/tmp/bla")
     ⇒ Event (35025468 renamed "/tmp/foo" "/tmp/bla")
(file-notify-add-watch
  "/var/tmp" '(change attribute-change) 'my-notify-callback)
     ⇒ 35025504
(rename-file "/tmp/bla" "/var/tmp/bla")
     ⇒ ;; gfilenotify
        Event (35025468 renamed "/tmp/bla" "/var/tmp/bla")

     ⇒ ;; inotify
        Event (35025504 created "/var/tmp/bla")
        Event (35025468 deleted "/tmp/bla")
Function: file-notify-rm-watch descriptor

Removes an existing file watch specified by its descriptor. descriptor should be an object returned by file-notify-add-watch.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.20 Dynamically Loaded Libraries

A dynamically loaded library is a library that is loaded on demand, when its facilities are first needed. Emacs supports such on-demand loading of support libraries for some of its features.

Variable: dynamic-library-alist

This is an alist of dynamic libraries and external library files implementing them.

Each element is a list of the form (library files…), where the car is a symbol representing a supported external library, and the rest are strings giving alternate filenames for that library.

Emacs tries to load the library from the files in the order they appear in the list; if none is found, the Emacs session won’t have access to that library, and the features it provides will be unavailable.

Image support on some platforms uses this facility. Here’s an example of setting this variable for supporting images on MS-Windows:

(setq dynamic-library-alist
      '((xpm "libxpm.dll" "xpm4.dll" "libXpm-nox4.dll")
        (png "libpng12d.dll" "libpng12.dll" "libpng.dll"
             "libpng13d.dll" "libpng13.dll")
        (jpeg "jpeg62.dll" "libjpeg.dll" "jpeg-62.dll"
              "jpeg.dll")
        (tiff "libtiff3.dll" "libtiff.dll")
        (gif "giflib4.dll" "libungif4.dll" "libungif.dll")
        (svg "librsvg-2-2.dll")
        (gdk-pixbuf "libgdk_pixbuf-2.0-0.dll")
        (glib "libglib-2.0-0.dll")
	(gobject "libgobject-2.0-0.dll")))

Note that image types pbm and xbm do not need entries in this variable because they do not depend on external libraries and are always available in Emacs.

Also note that this variable is not meant to be a generic facility for accessing external libraries; only those already known by Emacs can be loaded through it.

This variable is ignored if the given library is statically linked into Emacs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39 Preparing Lisp code for distribution

Emacs provides a standard way to distribute Emacs Lisp code to users. A package is a collection of one or more files, formatted and bundled in such a way that users can easily download, install, uninstall, and upgrade it.

The following sections describe how to create a package, and how to put it in a package archive for others to download. See Packages in The GNU Emacs Manual, for a description of user-level features of the packaging system.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39.1 Packaging Basics

A package is either a simple package or a multi-file package. A simple package is stored in a package archive as a single Emacs Lisp file, while a multi-file package is stored as a tar file (containing multiple Lisp files, and possibly non-Lisp files such as a manual).

In ordinary usage, the difference between simple packages and multi-file packages is relatively unimportant; the Package Menu interface makes no distinction between them. However, the procedure for creating them differs, as explained in the following sections.

Each package (whether simple or multi-file) has certain attributes:

Name

A short word (e.g., ‘auctex’). This is usually also the symbol prefix used in the program (see section Emacs Lisp Coding Conventions).

Version

A version number, in a form that the function version-to-list understands (e.g., ‘11.86’). Each release of a package should be accompanied by an increase in the version number.

Brief description

This is shown when the package is listed in the Package Menu. It should occupy a single line, ideally in 36 characters or less.

Long description

This is shown in the buffer created by C-h P (describe-package), following the package’s brief description and installation status. It normally spans multiple lines, and should fully describe the package’s capabilities and how to begin using it once it is installed.

Dependencies

A list of other packages (possibly including minimal acceptable version numbers) on which this package depends. The list may be empty, meaning this package has no dependencies. Otherwise, installing this package also automatically installs its dependencies; if any dependency cannot be found, the package cannot be installed.

Installing a package, either via the command package-install-file, or via the Package Menu, creates a subdirectory of package-user-dir named name-version, where name is the package’s name and version its version (e.g., ~/.emacs.d/elpa/auctex-11.86/). We call this the package’s content directory. It is where Emacs puts the package’s contents (the single Lisp file for a simple package, or the files extracted from a multi-file package).

Emacs then searches every Lisp file in the content directory for autoload magic comments (see section Autoload). These autoload definitions are saved to a file named name-autoloads.el in the content directory. They are typically used to autoload the principal user commands defined in the package, but they can also perform other tasks, such as adding an element to auto-mode-alist (see section How Emacs Chooses a Major Mode). Note that a package typically does not autoload every function and variable defined within it—only the handful of commands typically called to begin using the package. Emacs then byte-compiles every Lisp file in the package.

After installation, the installed package is loaded: Emacs adds the package’s content directory to load-path, and evaluates the autoload definitions in name-autoloads.el.

Whenever Emacs starts up, it automatically calls the function package-initialize to load installed packages. This is done after loading the init file and abbrev file (if any) and before running after-init-hook (see section Summary: Sequence of Actions at Startup). Automatic package loading is disabled if the user option package-enable-at-startup is nil.

Command: package-initialize &optional no-activate

This function initializes Emacs’ internal record of which packages are installed, and loads them. The user option package-load-list specifies which packages to load; by default, all installed packages are loaded. See Package Installation in The GNU Emacs Manual.

The optional argument no-activate, if non-nil, causes Emacs to update its record of installed packages without actually loading them; it is for internal use only.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39.2 Simple Packages

A simple package consists of a single Emacs Lisp source file. The file must conform to the Emacs Lisp library header conventions (see section Conventional Headers for Emacs Libraries). The package’s attributes are taken from the various headers, as illustrated by the following example:

;;; superfrobnicator.el --- Frobnicate and bifurcate flanges

;; Copyright (C) 2011 Free Software Foundation, Inc.
;; Author: J. R. Hacker <jrh@example.com>
;; Version: 1.3
;; Package-Requires: ((flange "1.0"))
;; Keywords: multimedia, frobnicate
;; URL: http://example.com/jrhacker/superfrobnicate

…

;;; Commentary:

;; This package provides a minor mode to frobnicate and/or
;; bifurcate any flanges you desire.  To activate it, just type
…

;;;###autoload
(define-minor-mode superfrobnicator-mode
…

The name of the package is the same as the base name of the file, as written on the first line. Here, it is ‘superfrobnicator’.

The brief description is also taken from the first line. Here, it is ‘Frobnicate and bifurcate flanges’.

The version number comes from the ‘Package-Version’ header, if it exists, or from the ‘Version’ header otherwise. One or the other must be present. Here, the version number is 1.3.

If the file has a ‘;;; Commentary:’ section, this section is used as the long description. (When displaying the description, Emacs omits the ‘;;; Commentary:’ line, as well as the leading comment characters in the commentary itself.)

If the file has a ‘Package-Requires’ header, that is used as the package dependencies. In the above example, the package depends on the ‘flange’ package, version 1.0 or higher. See section Conventional Headers for Emacs Libraries, for a description of the ‘Package-Requires’ header. If the header is omitted, the package has no dependencies.

The ‘Keywords’ and ‘URL’ headers are optional, but recommended. The command describe-package uses these to add links to its output. The ‘Keywords’ header should contain at least one standard keyword from the finder-known-keywords list.

The file ought to also contain one or more autoload magic comments, as explained in Packaging Basics. In the above example, a magic comment autoloads superfrobnicator-mode.

See section Creating and Maintaining Package Archives, for a explanation of how to add a single-file package to a package archive.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39.3 Multi-file Packages

A multi-file package is less convenient to create than a single-file package, but it offers more features: it can include multiple Emacs Lisp files, an Info manual, and other file types (such as images).

Prior to installation, a multi-file package is stored in a package archive as a tar file. The tar file must be named name-version.tar, where name is the package name and version is the version number. Its contents, once extracted, must all appear in a directory named name-version, the content directory (see section Packaging Basics). Files may also extract into subdirectories of the content directory.

One of the files in the content directory must be named name-pkg.el. It must contain a single Lisp form, consisting of a call to the function define-package, described below. This defines the package’s version, brief description, and requirements.

For example, if we distribute version 1.3 of the superfrobnicator as a multi-file package, the tar file would be superfrobnicator-1.3.tar. Its contents would extract into the directory superfrobnicator-1.3, and one of these would be the file superfrobnicator-pkg.el.

Function: define-package name version &optional docstring requirements

This function defines a package. name is the package name, a string. version is the version, as a string of a form that can be understood by the function version-to-list. docstring is the brief description.

requirements is a list of required packages and their versions. Each element in this list should have the form (dep-name dep-version), where dep-name is a symbol whose name is the dependency’s package name, and dep-version is the dependency’s version (a string).

If the content directory contains a file named README, this file is used as the long description.

If the content directory contains a file named dir, this is assumed to be an Info directory file made with install-info. See Invoking install-info in Texinfo. The relevant Info files should also be present in the content directory. In this case, Emacs will automatically add the content directory to Info-directory-list when the package is activated.

Do not include any .elc files in the package. Those are created when the package is installed. Note that there is no way to control the order in which files are byte-compiled.

Do not include any file named name-autoloads.el. This file is reserved for the package’s autoload definitions (see section Packaging Basics). It is created automatically when the package is installed, by searching all the Lisp files in the package for autoload magic comments.

If the multi-file package contains auxiliary data files (such as images), the package’s Lisp code can refer to these files via the variable load-file-name (see section Loading). Here is an example:

(defconst superfrobnicator-base (file-name-directory load-file-name))

(defun superfrobnicator-fetch-image (file)
  (expand-file-name file superfrobnicator-base))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39.4 Creating and Maintaining Package Archives

Via the Package Menu, users may download packages from package archives. Such archives are specified by the variable package-archives, whose default value contains a single entry: the archive hosted by the GNU project at http://elpa.gnu.org. This section describes how to set up and maintain a package archive.

User Option: package-archives

The value of this variable is an alist of package archives recognized by the Emacs package manager.

Each alist element corresponds to one archive, and should have the form (id . location), where id is the name of the archive (a string) and location is its base location (a string).

If the base location starts with ‘http:’, it is treated as a HTTP URL, and packages are downloaded from this archive via HTTP (as is the case for the default GNU archive).

Otherwise, the base location should be a directory name. In this case, Emacs retrieves packages from this archive via ordinary file access. Such “local” archives are mainly useful for testing.

A package archive is simply a directory in which the package files, and associated files, are stored. If you want the archive to be reachable via HTTP, this directory must be accessible to a web server. How to accomplish this is beyond the scope of this manual.

A convenient way to set up and update a package archive is via the package-x library. This is included with Emacs, but not loaded by default; type M-x load-library RET package-x RET to load it, or add (require 'package-x) to your init file. See Lisp Libraries in The GNU Emacs Manual. Once loaded, you can make use of the following:

User Option: package-archive-upload-base

The value of this variable is the base location of a package archive, as a directory name. The commands in the package-x library will use this base location.

The directory name should be absolute. You may specify a remote name, such as /ssh:foo@example.com:/var/www/packages/, if the package archive is on a different machine. See Remote Files in The GNU Emacs Manual.

Command: package-upload-file filename

This command prompts for filename, a file name, and uploads that file to package-archive-upload-base. The file must be either a simple package (a .el file) or a multi-file package (a .tar file); otherwise, an error is raised. The package attributes are automatically extracted, and the archive’s contents list is updated with this information.

If package-archive-upload-base does not specify a valid directory, the function prompts interactively for one. If the directory does not exist, it is created. The directory need not have any initial contents (i.e., you can use this command to populate an initially empty archive).

Command: package-upload-buffer

This command is similar to package-upload-file, but instead of prompting for a package file, it uploads the contents of the current buffer. The current buffer must be visiting a simple package (a .el file) or a multi-file package (a .tar file); otherwise, an error is raised.

After you create an archive, remember that it is not accessible in the Package Menu interface unless it is in package-archives.

Maintaining a public package archive entails a degree of responsibility. When Emacs users install packages from your archive, those packages can cause Emacs to run arbitrary code with the permissions of the installing user. (This is true for Emacs code in general, not just for packages.) So you should ensure that your archive is well-maintained and keep the hosting system secure.

One way to increase the security of your packages is to sign them using a cryptographic key. If you have generated a private/public gpg key pair, you can use gpg to sign the package like this:

gpg -ba -o file.sig file

For a single-file package, file is the package Lisp file; for a multi-file package, it is the package tar file. You can also sign the archive’s contents file in the same way. Make the .sig files available in the same location as the packages. You should also make your public key available for people to download; e.g., by uploading it to a key server such as http://pgp.mit.edu/. When people install packages from your archive, they can use your public key to verify the signatures.

A full explanation of these matters is outside the scope of this manual. For more information on cryptographic keys and signing, see GnuPG in The GNU Privacy Guard Manual. Emacs comes with an interface to GNU Privacy Guard, see EasyPG in Emacs EasyPG Assistant Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix A Emacs 23 Antinews

For those users who live backwards in time, here is information about downgrading to Emacs version 23.4. We hope you will enjoy the greater simplicity that results from the absence of many Emacs 24.5 features.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

A.1 Old Lisp Features in Emacs 23


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix B GNU Free Documentation License

Version 1.3, 3 November 2008
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
http://fsf.org/

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
  1. PREAMBLE

    The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

    This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

    We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

  2. APPLICABILITY AND DEFINITIONS

    This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

    A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

    A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

    The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

    The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

    A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.

    Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

    The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.

    The “publisher” means any person or entity that distributes copies of the Document to the public.

    A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.

    The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

  3. VERBATIM COPYING

    You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

    You may also lend copies, under the same conditions stated above, and you may publicly display copies.

  4. COPYING IN QUANTITY

    If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

    If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

    If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

    It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

  5. MODIFICATIONS

    You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

    1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
    2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
    3. State on the Title page the name of the publisher of the Modified Version, as the publisher.
    4. Preserve all the copyright notices of the Document.
    5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
    6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
    7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice.
    8. Include an unaltered copy of this License.
    9. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
    10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
    11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
    12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
    13. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version.
    14. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section.
    15. Preserve any Warranty Disclaimers.

    If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles.

    You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

    You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

    The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

  6. COMBINING DOCUMENTS

    You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

    The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

    In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”

  7. COLLECTIONS OF DOCUMENTS

    You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

    You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

  8. AGGREGATION WITH INDEPENDENT WORKS

    A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

    If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

  9. TRANSLATION

    Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

    If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

  10. TERMINATION

    You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.

  11. FUTURE REVISIONS OF THIS LICENSE

    The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

    Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

  12. RELICENSING

    “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site.

    “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

    “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document.

    An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

    The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

  Copyright (C)  year  your name.
  Permission is granted to copy, distribute and/or modify this document
  under the terms of the GNU Free Documentation License, Version 1.3
  or any later version published by the Free Software Foundation;
  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
  Texts.  A copy of the license is included in the section entitled ``GNU
  Free Documentation License''.

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with…Texts.” line with this:

    with the Invariant Sections being list their titles, with
    the Front-Cover Texts being list, and with the Back-Cover Texts
    being list.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix C GNU General Public License

Version 3, 29 June 2007
Copyright © 2007 Free Software Foundation, Inc. http://fsf.org/

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program—to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers’ and authors’ protection, the GPL clearly explains that there is no warranty for this free software. For both users’ and authors’ sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users’ freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

  1. Definitions.

    “This License” refers to version 3 of the GNU General Public License.

    “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

    “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

    To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

    A “covered work” means either the unmodified Program or a work based on the Program.

    To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

    To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

    An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

  2. Source Code.

    The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

    A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

    The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

    The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work’s System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

    The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

    The Corresponding Source for a work in source code form is that same work.

  3. Basic Permissions.

    All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

    You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

    Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

  4. Protecting Users’ Legal Rights From Anti-Circumvention Law.

    No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

    When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work’s users, your or third parties’ legal rights to forbid circumvention of technological measures.

  5. Conveying Verbatim Copies.

    You may convey verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

    You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

  6. Conveying Modified Source Versions.

    You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

    1. The work must carry prominent notices stating that you modified it, and giving a relevant date.
    2. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
    3. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
    4. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.

    A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation’s users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

  7. Conveying Non-Source Forms.

    You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

    1. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
    2. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
    3. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
    4. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
    5. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.

    A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

    A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

    “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

    If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

    The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

    Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

  8. Additional Terms.

    “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

    When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

    Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

    1. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
    2. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
    3. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
    4. Limiting the use for publicity purposes of names of licensors or authors of the material; or
    5. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
    6. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.

    All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

    If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

    Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

  9. Termination.

    You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

  10. Acceptance Not Required for Having Copies.

    You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

  11. Automatic Licensing of Downstream Recipients.

    Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

    An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party’s predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

    You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

  12. Patents.

    A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor’s “contributor version”.

    A contributor’s “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

    Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor’s essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

    In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

    If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient’s use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

    If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

    A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

    Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

  13. No Surrender of Others’ Freedom.

    If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

  14. Use with the GNU Affero General Public License.

    Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

  15. Revised Versions of this License.

    The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

    If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

    Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

  16. Disclaimer of Warranty.

    THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  17. Limitation of Liability.

    IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

  18. Interpretation of Sections 15 and 16.

    If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

one line to give the program's name and a brief idea of what it does.
Copyright (C) year name of author

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see http://www.gnu.org/licenses/.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

program Copyright (C) year name of author
This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’.
This is free software, and you are welcome to redistribute it
under certain conditions; type ‘show c’ for details.

The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, your program’s commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see http://www.gnu.org/licenses/.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix D Tips and Conventions

This chapter describes no additional features of Emacs Lisp. Instead it gives advice on making effective use of the features described in the previous chapters, and describes conventions Emacs Lisp programmers should follow.

You can automatically check some of the conventions described below by running the command M-x checkdoc RET when visiting a Lisp file. It cannot check all of the conventions, and not all the warnings it gives necessarily correspond to problems, but it is worth examining them all.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.1 Emacs Lisp Coding Conventions

Here are conventions that you should follow when writing Emacs Lisp code intended for widespread use:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.2 Key Binding Conventions


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.3 Emacs Programming Tips

Following these conventions will make your program fit better into Emacs when it runs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.4 Tips for Making Compiled Code Fast

Here are ways of improving the execution speed of byte-compiled Lisp programs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.5 Tips for Avoiding Compiler Warnings


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.6 Tips for Documentation Strings

Here are some tips and conventions for the writing of documentation strings. You can check many of these conventions by running the command M-x checkdoc-minor-mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.7 Tips on Writing Comments

We recommend these conventions for comments:

;

Comments that start with a single semicolon, ‘;’, should all be aligned to the same column on the right of the source code. Such comments usually explain how the code on that line does its job. For example:

(setq base-version-list                 ; There was a base
      (assoc (substring fn 0 start-vn)  ; version to which
             file-version-assoc-list))  ; this looks like
                                        ; a subversion.
;;

Comments that start with two semicolons, ‘;;’, should be aligned to the same level of indentation as the code. Such comments usually describe the purpose of the following lines or the state of the program at that point. For example:

(prog1 (setq auto-fill-function
             …
             …
  ;; Update mode line.
  (force-mode-line-update)))

We also normally use two semicolons for comments outside functions.

;; This Lisp code is run in Emacs when it is to operate as
;; a server for other processes.

If a function has no documentation string, it should instead have a two-semicolon comment right before the function, explaining what the function does and how to call it properly. Explain precisely what each argument means and how the function interprets its possible values. It is much better to convert such comments to documentation strings, though.

;;;

Comments that start with three semicolons, ‘;;;’, should start at the left margin. We use them for comments which should be considered a “heading” by Outline minor mode. By default, comments starting with at least three semicolons (followed by a single space and a non-whitespace character) are considered headings, comments starting with two or fewer are not. Historically, triple-semicolon comments have also been used for commenting out lines within a function, but this use is discouraged.

When commenting out entire functions, use two semicolons.

;;;;

Comments that start with four semicolons, ‘;;;;’, should be aligned to the left margin and are used for headings of major sections of a program. For example:

;;;; The kill ring

Generally speaking, the M-; (comment-dwim) command automatically starts a comment of the appropriate type; or indents an existing comment to the right place, depending on the number of semicolons. See Manipulating Comments in The GNU Emacs Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.8 Conventional Headers for Emacs Libraries

Emacs has conventions for using special comments in Lisp libraries to divide them into sections and give information such as who wrote them. Using a standard format for these items makes it easier for tools (and people) to extract the relevant information. This section explains these conventions, starting with an example:

;;; foo.el --- Support for the Foo programming language

;; Copyright (C) 2010-2015 Your Name
;; Author: Your Name <yourname@example.com>
;; Maintainer: Someone Else <someone@example.com>
;; Created: 14 Jul 2010
;; Keywords: languages
;; Homepage: http://example.com/foo

;; This file is not part of GNU Emacs.

;; This file is free software…
…
;; along with this file.  If not, see <http://www.gnu.org/licenses/>.

The very first line should have this format:

;;; filename --- description

The description should be contained in one line. If the file needs a ‘-*-’ specification, put it after description. If this would make the first line too long, use a Local Variables section at the end of the file.

The copyright notice usually lists your name (if you wrote the file). If you have an employer who claims copyright on your work, you might need to list them instead. Do not say that the copyright holder is the Free Software Foundation (or that the file is part of GNU Emacs) unless your file has been accepted into the Emacs distribution. For more information on the form of copyright and license notices, see the guide on the GNU website.

After the copyright notice come several header comment lines, each beginning with ‘;; header-name:’. Here is a table of the conventional possibilities for header-name:

Author

This line states the name and email address of at least the principal author of the library. If there are multiple authors, list them on continuation lines led by ;; and a tab or at least two spaces. We recommend including a contact email address, of the form ‘<…>’. For example:

;; Author: Your Name <yourname@example.com>
;;      Someone Else <someone@example.com>
;;      Another Person <another@example.com>
Maintainer

This header has the same format as the Author header. It lists the person(s) who currently maintain(s) the file (respond to bug reports, etc.).

If there is no maintainer line, the person(s) in the Author field is/are presumed to be the maintainers. Some files in Emacs use ‘FSF’ for the maintainer. This means that the original author is no longer responsible for the file, and that it is maintained as part of Emacs.

Created

This optional line gives the original creation date of the file, and is for historical interest only.

Version

If you wish to record version numbers for the individual Lisp program, put them in this line. Lisp files distributed with Emacs generally do not have a ‘Version’ header, since the version number of Emacs itself serves the same purpose. If you are distributing a collection of multiple files, we recommend not writing the version in every file, but only the main one.

Keywords

This line lists keywords for the finder-by-keyword help command. Please use that command to see a list of the meaningful keywords.

This field is how people will find your package when they’re looking for things by topic. To separate the keywords, you can use spaces, commas, or both.

The name of this field is unfortunate, since people often assume it is the place to write arbitrary keywords that describe their package, rather than just the relevant Finder keywords.

Homepage

This line states the homepage of the library.

Package-Version

If ‘Version’ is not suitable for use by the package manager, then a package can define ‘Package-Version’; it will be used instead. This is handy if ‘Version’ is an RCS id or something else that cannot be parsed by version-to-list. See section Packaging Basics.

Package-Requires

If this exists, it names packages on which the current package depends for proper operation. See section Packaging Basics. This is used by the package manager both at download time (to ensure that a complete set of packages is downloaded) and at activation time (to ensure that a package is only activated if all its dependencies have been).

Its format is a list of lists. The car of each sub-list is the name of a package, as a symbol. The cadr of each sub-list is the minimum acceptable version number, as a string. For instance:

;; Package-Requires: ((gnus "1.0") (bubbles "2.7.2"))

The package code automatically defines a package named ‘emacs’ with the version number of the currently running Emacs. This can be used to require a minimal version of Emacs for a package.

Just about every Lisp library ought to have the ‘Author’ and ‘Keywords’ header comment lines. Use the others if they are appropriate. You can also put in header lines with other header names—they have no standard meanings, so they can’t do any harm.

We use additional stylized comments to subdivide the contents of the library file. These should be separated from anything else by blank lines. Here is a table of them:

;;; Commentary:

This begins introductory comments that explain how the library works. It should come right after the copying permissions, terminated by a ‘Change Log’, ‘History’ or ‘Code’ comment line. This text is used by the Finder package, so it should make sense in that context.

;;; Change Log:

This begins an optional log of changes to the file over time. Don’t put too much information in this section—it is better to keep the detailed logs in a version control system (as Emacs does) or in a separate ChangeLog file. ‘History’ is an alternative to ‘Change Log’.

;;; Code:

This begins the actual code of the program.

;;; filename ends here

This is the footer line; it appears at the very end of the file. Its purpose is to enable people to detect truncated versions of the file from the lack of a footer line.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix E GNU Emacs Internals

This chapter describes how the runnable Emacs executable is dumped with the preloaded Lisp libraries in it, how storage is allocated, and some internal aspects of GNU Emacs that may be of interest to C programmers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.1 Building Emacs

This section explains the steps involved in building the Emacs executable. You don’t have to know this material to build and install Emacs, since the makefiles do all these things automatically. This information is pertinent to Emacs developers.

Compilation of the C source files in the src directory produces an executable file called temacs, also called a bare impure Emacs. It contains the Emacs Lisp interpreter and I/O routines, but not the editing commands.

The command temacs -l loadup would run temacs and direct it to load loadup.el. The loadup library loads additional Lisp libraries, which set up the normal Emacs editing environment. After this step, the Emacs executable is no longer bare.

Because it takes some time to load the standard Lisp files, the temacs executable usually isn’t run directly by users. Instead, as one of the last steps of building Emacs, the command ‘temacs -batch -l loadup dump’ is run. The special ‘dump’ argument causes temacs to dump out an executable program, called emacs, which has all the standard Lisp files preloaded. (The ‘-batch’ argument prevents temacs from trying to initialize any of its data on the terminal, so that the tables of terminal information are empty in the dumped Emacs.)

The dumped emacs executable (also called a pure Emacs) is the one which is installed. The variable preloaded-file-list stores a list of the Lisp files preloaded into the dumped Emacs. If you port Emacs to a new operating system, and are not able to implement dumping, then Emacs must load loadup.el each time it starts.

You can specify additional files to preload by writing a library named site-load.el that loads them. You may need to rebuild Emacs with an added definition

#define SITELOAD_PURESIZE_EXTRA n

to make n added bytes of pure space to hold the additional files; see src/puresize.h. (Try adding increments of 20000 until it is big enough.) However, the advantage of preloading additional files decreases as machines get faster. On modern machines, it is usually not advisable.

After loadup.el reads site-load.el, it finds the documentation strings for primitive and preloaded functions (and variables) in the file etc/DOC where they are stored, by calling Snarf-documentation (see Accessing Documentation).

You can specify other Lisp expressions to execute just before dumping by putting them in a library named site-init.el. This file is executed after the documentation strings are found.

If you want to preload function or variable definitions, there are three ways you can do this and make their documentation strings accessible when you subsequently run Emacs:

It is not advisable to put anything in site-load.el or site-init.el that would alter any of the features that users expect in an ordinary unmodified Emacs. If you feel you must override normal features for your site, do it with default.el, so that users can override your changes if they wish. See section Summary: Sequence of Actions at Startup. Note that if either site-load.el or site-init.el changes load-path, the changes will be lost after dumping. See section Library Search. To make a permanent change to load-path, use the --enable-locallisppath option of configure.

In a package that can be preloaded, it is sometimes necessary (or useful) to delay certain evaluations until Emacs subsequently starts up. The vast majority of such cases relate to the values of customizable variables. For example, tutorial-directory is a variable defined in startup.el, which is preloaded. The default value is set based on data-directory. The variable needs to access the value of data-directory when Emacs starts, not when it is dumped, because the Emacs executable has probably been installed in a different location since it was dumped.

Function: custom-initialize-delay symbol value

This function delays the initialization of symbol to the next Emacs start. You normally use this function by specifying it as the :initialize property of a customizable variable. (The argument value is unused, and is provided only for compatibility with the form Custom expects.)

In the unlikely event that you need a more general functionality than custom-initialize-delay provides, you can use before-init-hook (see section Summary: Sequence of Actions at Startup).

Function: dump-emacs to-file from-file

This function dumps the current state of Emacs into an executable file to-file. It takes symbols from from-file (this is normally the executable file temacs).

If you want to use this function in an Emacs that was already dumped, you must run Emacs with ‘-batch’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.2 Pure Storage

Emacs Lisp uses two kinds of storage for user-created Lisp objects: normal storage and pure storage. Normal storage is where all the new data created during an Emacs session are kept (see section Garbage Collection). Pure storage is used for certain data in the preloaded standard Lisp files—data that should never change during actual use of Emacs.

Pure storage is allocated only while temacs is loading the standard preloaded Lisp libraries. In the file emacs, it is marked as read-only (on operating systems that permit this), so that the memory space can be shared by all the Emacs jobs running on the machine at once. Pure storage is not expandable; a fixed amount is allocated when Emacs is compiled, and if that is not sufficient for the preloaded libraries, temacs allocates dynamic memory for the part that didn’t fit. The resulting image will work, but garbage collection (see section Garbage Collection) is disabled in this situation, causing a memory leak. Such an overflow normally won’t happen unless you try to preload additional libraries or add features to the standard ones. Emacs will display a warning about the overflow when it starts. If this happens, you should increase the compilation parameter SYSTEM_PURESIZE_EXTRA in the file src/puresize.h and rebuild Emacs.

Function: purecopy object

This function makes a copy in pure storage of object, and returns it. It copies a string by simply making a new string with the same characters, but without text properties, in pure storage. It recursively copies the contents of vectors and cons cells. It does not make copies of other objects such as symbols, but just returns them unchanged. It signals an error if asked to copy markers.

This function is a no-op except while Emacs is being built and dumped; it is usually called only in preloaded Lisp files.

Variable: pure-bytes-used

The value of this variable is the number of bytes of pure storage allocated so far. Typically, in a dumped Emacs, this number is very close to the total amount of pure storage available—if it were not, we would preallocate less.

Variable: purify-flag

This variable determines whether defun should make a copy of the function definition in pure storage. If it is non-nil, then the function definition is copied into pure storage.

This flag is t while loading all of the basic functions for building Emacs initially (allowing those functions to be shareable and non-collectible). Dumping Emacs as an executable always writes nil in this variable, regardless of the value it actually has before and after dumping.

You should not change this flag in a running Emacs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.3 Garbage Collection

When a program creates a list or the user defines a new function (such as by loading a library), that data is placed in normal storage. If normal storage runs low, then Emacs asks the operating system to allocate more memory. Different types of Lisp objects, such as symbols, cons cells, small vectors, markers, etc., are segregated in distinct blocks in memory. (Large vectors, long strings, buffers and certain other editing types, which are fairly large, are allocated in individual blocks, one per object; small strings are packed into blocks of 8k bytes, and small vectors are packed into blocks of 4k bytes).

Beyond the basic vector, a lot of objects like window, buffer, and frame are managed as if they were vectors. The corresponding C data structures include the struct vectorlike_header field whose size member contains the subtype enumerated by enum pvec_type and an information about how many Lisp_Object fields this structure contains and what the size of the rest data is. This information is needed to calculate the memory footprint of an object, and used by the vector allocation code while iterating over the vector blocks.

It is quite common to use some storage for a while, then release it by (for example) killing a buffer or deleting the last pointer to an object. Emacs provides a garbage collector to reclaim this abandoned storage. The garbage collector operates by finding and marking all Lisp objects that are still accessible to Lisp programs. To begin with, it assumes all the symbols, their values and associated function definitions, and any data presently on the stack, are accessible. Any objects that can be reached indirectly through other accessible objects are also accessible.

When marking is finished, all objects still unmarked are garbage. No matter what the Lisp program or the user does, it is impossible to refer to them, since there is no longer a way to reach them. Their space might as well be reused, since no one will miss them. The second (“sweep”) phase of the garbage collector arranges to reuse them.

The sweep phase puts unused cons cells onto a free list for future allocation; likewise for symbols and markers. It compacts the accessible strings so they occupy fewer 8k blocks; then it frees the other 8k blocks. Unreachable vectors from vector blocks are coalesced to create largest possible free areas; if a free area spans a complete 4k block, that block is freed. Otherwise, the free area is recorded in a free list array, where each entry corresponds to a free list of areas of the same size. Large vectors, buffers, and other large objects are allocated and freed individually.

Common Lisp note: Unlike other Lisps, GNU Emacs Lisp does not call the garbage collector when the free list is empty. Instead, it simply requests the operating system to allocate more storage, and processing continues until gc-cons-threshold bytes have been used.

This means that you can make sure that the garbage collector will not run during a certain portion of a Lisp program by calling the garbage collector explicitly just before it (provided that portion of the program does not use so much space as to force a second garbage collection).

Command: garbage-collect

This command runs a garbage collection, and returns information on the amount of space in use. (Garbage collection can also occur spontaneously if you use more than gc-cons-threshold bytes of Lisp data since the previous garbage collection.)

garbage-collect returns a list with information on amount of space in use, where each entry has the form ‘(name size used)’ or ‘(name size used free)’. In the entry, name is a symbol describing the kind of objects this entry represents, size is the number of bytes used by each one, used is the number of those objects that were found live in the heap, and optional free is the number of those objects that are not live but that Emacs keeps around for future allocations. So an overall result is:

((conses cons-size used-conses free-conses)
 (symbols symbol-size used-symbols free-symbols)
 (miscs misc-size used-miscs free-miscs)
 (strings string-size used-strings free-strings)
 (string-bytes byte-size used-bytes)
 (vectors vector-size used-vectors)
 (vector-slots slot-size used-slots free-slots)
 (floats float-size used-floats free-floats)
 (intervals interval-size used-intervals free-intervals)
 (buffers buffer-size used-buffers)
 (heap unit-size total-size free-size))

Here is an example:

(garbage-collect)
      ⇒ ((conses 16 49126 8058) (symbols 48 14607 0)
                 (miscs 40 34 56) (strings 32 2942 2607)
                 (string-bytes 1 78607) (vectors 16 7247)
                 (vector-slots 8 341609 29474) (floats 8 71 102)
                 (intervals 56 27 26) (buffers 944 8)
                 (heap 1024 11715 2678))

Below is a table explaining each element. Note that last heap entry is optional and present only if an underlying malloc implementation provides mallinfo function.

cons-size

Internal size of a cons cell, i.e., sizeof (struct Lisp_Cons).

used-conses

The number of cons cells in use.

free-conses

The number of cons cells for which space has been obtained from the operating system, but that are not currently being used.

symbol-size

Internal size of a symbol, i.e., sizeof (struct Lisp_Symbol).

used-symbols

The number of symbols in use.

free-symbols

The number of symbols for which space has been obtained from the operating system, but that are not currently being used.

misc-size

Internal size of a miscellaneous entity, i.e., sizeof (union Lisp_Misc), which is a size of the largest type enumerated in enum Lisp_Misc_Type.

used-miscs

The number of miscellaneous objects in use. These include markers and overlays, plus certain objects not visible to users.

free-miscs

The number of miscellaneous objects for which space has been obtained from the operating system, but that are not currently being used.

string-size

Internal size of a string header, i.e., sizeof (struct Lisp_String).

used-strings

The number of string headers in use.

free-strings

The number of string headers for which space has been obtained from the operating system, but that are not currently being used.

byte-size

This is used for convenience and equals to sizeof (char).

used-bytes

The total size of all string data in bytes.

vector-size

Internal size of a vector header, i.e., sizeof (struct Lisp_Vector).

used-vectors

The number of vector headers allocated from the vector blocks.

slot-size

Internal size of a vector slot, always equal to sizeof (Lisp_Object).

used-slots

The number of slots in all used vectors.

free-slots

The number of free slots in all vector blocks.

float-size

Internal size of a float object, i.e., sizeof (struct Lisp_Float). (Do not confuse it with the native platform float or double.)

used-floats

The number of floats in use.

free-floats

The number of floats for which space has been obtained from the operating system, but that are not currently being used.

interval-size

Internal size of an interval object, i.e., sizeof (struct interval).

used-intervals

The number of intervals in use.

free-intervals

The number of intervals for which space has been obtained from the operating system, but that are not currently being used.

buffer-size

Internal size of a buffer, i.e., sizeof (struct buffer). (Do not confuse with the value returned by buffer-size function.)

used-buffers

The number of buffer objects in use. This includes killed buffers invisible to users, i.e., all buffers in all_buffers list.

unit-size

The unit of heap space measurement, always equal to 1024 bytes.

total-size

Total heap size, in unit-size units.

free-size

Heap space which is not currently used, in unit-size units.

If there was overflow in pure space (see section Pure Storage), garbage-collect returns nil, because a real garbage collection cannot be done.

User Option: garbage-collection-messages

If this variable is non-nil, Emacs displays a message at the beginning and end of garbage collection. The default value is nil.

Variable: post-gc-hook

This is a normal hook that is run at the end of garbage collection. Garbage collection is inhibited while the hook functions run, so be careful writing them.

User Option: gc-cons-threshold

The value of this variable is the number of bytes of storage that must be allocated for Lisp objects after one garbage collection in order to trigger another garbage collection. You can use the result returned by garbage-collect to get an information about size of the particular object type; space allocated to the contents of buffers does not count. Note that the subsequent garbage collection does not happen immediately when the threshold is exhausted, but only the next time the Lisp interpreter is called.

The initial threshold value is GC_DEFAULT_THRESHOLD, defined in alloc.c. Since it’s defined in word_size units, the value is 400,000 for the default 32-bit configuration and 800,000 for the 64-bit one. If you specify a larger value, garbage collection will happen less often. This reduces the amount of time spent garbage collecting, but increases total memory use. You may want to do this when running a program that creates lots of Lisp data.

You can make collections more frequent by specifying a smaller value, down to 1/10th of GC_DEFAULT_THRESHOLD. A value less than this minimum will remain in effect only until the subsequent garbage collection, at which time garbage-collect will set the threshold back to the minimum.

User Option: gc-cons-percentage

The value of this variable specifies the amount of consing before a garbage collection occurs, as a fraction of the current heap size. This criterion and gc-cons-threshold apply in parallel, and garbage collection occurs only when both criteria are satisfied.

As the heap size increases, the time to perform a garbage collection increases. Thus, it can be desirable to do them less frequently in proportion.

The value returned by garbage-collect describes the amount of memory used by Lisp data, broken down by data type. By contrast, the function memory-limit provides information on the total amount of memory Emacs is currently using.

Function: memory-limit

This function returns the address of the last byte Emacs has allocated, divided by 1024. We divide the value by 1024 to make sure it fits in a Lisp integer.

You can use this to get a general idea of how your actions affect the memory usage.

Variable: memory-full

This variable is t if Emacs is nearly out of memory for Lisp objects, and nil otherwise.

Function: memory-use-counts

This returns a list of numbers that count the number of objects created in this Emacs session. Each of these counters increments for a certain kind of object. See the documentation string for details.

Variable: gcs-done

This variable contains the total number of garbage collections done so far in this Emacs session.

Variable: gc-elapsed

This variable contains the total number of seconds of elapsed time during garbage collection so far in this Emacs session, as a floating-point number.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.4 Memory Usage

These functions and variables give information about the total amount of memory allocation that Emacs has done, broken down by data type. Note the difference between these and the values returned by garbage-collect; those count objects that currently exist, but these count the number or size of all allocations, including those for objects that have since been freed.

Variable: cons-cells-consed

The total number of cons cells that have been allocated so far in this Emacs session.

Variable: floats-consed

The total number of floats that have been allocated so far in this Emacs session.

Variable: vector-cells-consed

The total number of vector cells that have been allocated so far in this Emacs session.

Variable: symbols-consed

The total number of symbols that have been allocated so far in this Emacs session.

Variable: string-chars-consed

The total number of string characters that have been allocated so far in this session.

Variable: misc-objects-consed

The total number of miscellaneous objects that have been allocated so far in this session. These include markers and overlays, plus certain objects not visible to users.

Variable: intervals-consed

The total number of intervals that have been allocated so far in this Emacs session.

Variable: strings-consed

The total number of strings that have been allocated so far in this Emacs session.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.5 C Dialect

The C part of Emacs is portable to C89: C99-specific features such as ‘<stdbool.h>’ and ‘inline’ are not used without a check, typically at configuration time, and the Emacs build procedure provides a substitute implementation if necessary. Some C99 features, such as declarations after statements, are too difficult to provide substitutes for, so they are avoided entirely.

At some point in the not-too-distant future the base C dialect will change from C89 to C99, and eventually it will no doubt change to C11.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.6 Writing Emacs Primitives

Lisp primitives are Lisp functions implemented in C. The details of interfacing the C function so that Lisp can call it are handled by a few C macros. The only way to really understand how to write new C code is to read the source, but we can explain some things here.

An example of a special form is the definition of or, from eval.c. (An ordinary function would have the same general appearance.)

DEFUN ("or", For, Sor, 0, UNEVALLED, 0,
  doc: /* Eval args until one of them yields non-nil, then return
that value.
The remaining args are not evalled at all.
If all args return nil, return nil.
usage: (or CONDITIONS ...)  */)
  (Lisp_Object args)
{
  register Lisp_Object val = Qnil;
  struct gcpro gcpro1;
  GCPRO1 (args);
  while (CONSP (args))
    {
      val = eval_sub (XCAR (args));
      if (!NILP (val))
        break;
      args = XCDR (args);
    }
  UNGCPRO;
  return val;
}

Let’s start with a precise explanation of the arguments to the DEFUN macro. Here is a template for them:

DEFUN (lname, fname, sname, min, max, interactive, doc)
lname

This is the name of the Lisp symbol to define as the function name; in the example above, it is or.

fname

This is the C function name for this function. This is the name that is used in C code for calling the function. The name is, by convention, ‘F’ prepended to the Lisp name, with all dashes (‘-’) in the Lisp name changed to underscores. Thus, to call this function from C code, call For.

sname

This is a C variable name to use for a structure that holds the data for the subr object that represents the function in Lisp. This structure conveys the Lisp symbol name to the initialization routine that will create the symbol and store the subr object as its definition. By convention, this name is always fname with ‘F’ replaced with ‘S’.

min

This is the minimum number of arguments that the function requires. The function or allows a minimum of zero arguments.

max

This is the maximum number of arguments that the function accepts, if there is a fixed maximum. Alternatively, it can be UNEVALLED, indicating a special form that receives unevaluated arguments, or MANY, indicating an unlimited number of evaluated arguments (the equivalent of &rest). Both UNEVALLED and MANY are macros. If max is a number, it must be more than min but less than 8.

interactive

This is an interactive specification, a string such as might be used as the argument of interactive in a Lisp function. In the case of or, it is 0 (a null pointer), indicating that or cannot be called interactively. A value of "" indicates a function that should receive no arguments when called interactively. If the value begins with a ‘"(’, the string is evaluated as a Lisp form. For example:

DEFUN ("foo", Ffoo, Sfoo, 0, UNEVALLED,
       "(list (read-char-by-name \"Insert character: \")\
              (prefix-numeric-value current-prefix-arg)\
              t))",
  doc: /* … /*)
doc

This is the documentation string. It uses C comment syntax rather than C string syntax because comment syntax requires nothing special to include multiple lines. The ‘doc:’ identifies the comment that follows as the documentation string. The ‘/*’ and ‘*/’ delimiters that begin and end the comment are not part of the documentation string.

If the last line of the documentation string begins with the keyword ‘usage:’, the rest of the line is treated as the argument list for documentation purposes. This way, you can use different argument names in the documentation string from the ones used in the C code. ‘usage:’ is required if the function has an unlimited number of arguments.

All the usual rules for documentation strings in Lisp code (see section Tips for Documentation Strings) apply to C code documentation strings too.

After the call to the DEFUN macro, you must write the argument list for the C function, including the types for the arguments. If the primitive accepts a fixed maximum number of Lisp arguments, there must be one C argument for each Lisp argument, and each argument must be of type Lisp_Object. (Various macros and functions for creating values of type Lisp_Object are declared in the file lisp.h.) If the primitive has no upper limit on the number of Lisp arguments, it must have exactly two C arguments: the first is the number of Lisp arguments, and the second is the address of a block containing their values. These have types int and Lisp_Object * respectively. Since Lisp_Object can hold any Lisp object of any data type, you can determine the actual data type only at run time; so if you want a primitive to accept only a certain type of argument, you must check the type explicitly using a suitable predicate (see section Type Predicates).

Within the function For itself, note the use of the macros GCPRO1 and UNGCPRO. These macros are defined for the sake of the few platforms which do not use Emacs’ default stack-marking garbage collector. The GCPRO1 macro “protects” a variable from garbage collection, explicitly informing the garbage collector that that variable and all its contents must be as accessible. GC protection is necessary in any function which can perform Lisp evaluation by calling eval_sub or Feval as a subroutine, either directly or indirectly.

It suffices to ensure that at least one pointer to each object is GC-protected. Thus, a particular local variable can do without protection if it is certain that the object it points to will be preserved by some other pointer (such as another local variable that has a GCPRO). Otherwise, the local variable needs a GCPRO.

The macro GCPRO1 protects just one local variable. If you want to protect two variables, use GCPRO2 instead; repeating GCPRO1 will not work. Macros GCPRO3, GCPRO4, GCPRO5, and GCPRO6 also exist. All these macros implicitly use local variables such as gcpro1; you must declare these explicitly, with type struct gcpro. Thus, if you use GCPRO2, you must declare gcpro1 and gcpro2.

UNGCPRO cancels the protection of the variables that are protected in the current function. It is necessary to do this explicitly.

You must not use C initializers for static or global variables unless the variables are never written once Emacs is dumped. These variables with initializers are allocated in an area of memory that becomes read-only (on certain operating systems) as a result of dumping Emacs. See section Pure Storage.

Defining the C function is not enough to make a Lisp primitive available; you must also create the Lisp symbol for the primitive and store a suitable subr object in its function cell. The code looks like this:

defsubr (&sname);

Here sname is the name you used as the third argument to DEFUN.

If you add a new primitive to a file that already has Lisp primitives defined in it, find the function (near the end of the file) named syms_of_something, and add the call to defsubr there. If the file doesn’t have this function, or if you create a new file, add to it a syms_of_filename (e.g., syms_of_myfile). Then find the spot in emacs.c where all of these functions are called, and add a call to syms_of_filename there.

The function syms_of_filename is also the place to define any C variables that are to be visible as Lisp variables. DEFVAR_LISP makes a C variable of type Lisp_Object visible in Lisp. DEFVAR_INT makes a C variable of type int visible in Lisp with a value that is always an integer. DEFVAR_BOOL makes a C variable of type int visible in Lisp with a value that is either t or nil. Note that variables defined with DEFVAR_BOOL are automatically added to the list byte-boolean-vars used by the byte compiler.

If you want to make a Lisp variables that is defined in C behave like one declared with defcustom, add an appropriate entry to cus-start.el.

If you define a file-scope C variable of type Lisp_Object, you must protect it from garbage-collection by calling staticpro in syms_of_filename, like this:

staticpro (&variable);

Here is another example function, with more complicated arguments. This comes from the code in window.c, and it demonstrates the use of macros and functions to manipulate Lisp objects.

DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p,
  Scoordinates_in_window_p, 2, 2, 0,
  doc: /* Return non-nil if COORDINATES are in WINDOW.
  ...
  or `right-margin' is returned.  */)
  (register Lisp_Object coordinates, Lisp_Object window)
{
  struct window *w;
  struct frame *f;
  int x, y;
  Lisp_Object lx, ly;
  CHECK_LIVE_WINDOW (window);
  w = XWINDOW (window);
  f = XFRAME (w->frame);
  CHECK_CONS (coordinates);
  lx = Fcar (coordinates);
  ly = Fcdr (coordinates);
  CHECK_NUMBER_OR_FLOAT (lx);
  CHECK_NUMBER_OR_FLOAT (ly);
  x = FRAME_PIXEL_X_FROM_CANON_X (f, lx) + FRAME_INTERNAL_BORDER_WIDTH(f);
  y = FRAME_PIXEL_Y_FROM_CANON_Y (f, ly) + FRAME_INTERNAL_BORDER_WIDTH(f);
  switch (coordinates_in_window (w, x, y))
    {
    case ON_NOTHING:            /* NOT in window at all. */
      return Qnil;
    ...

    case ON_MODE_LINE:          /* In mode line of window. */
      return Qmode_line;
    ...

    case ON_SCROLL_BAR:         /* On scroll-bar of window.  */
      /* Historically we are supposed to return nil in this case.  */
      return Qnil;
    default:
      abort ();
    }
}

Note that C code cannot call functions by name unless they are defined in C. The way to call a function written in Lisp is to use Ffuncall, which embodies the Lisp function funcall. Since the Lisp function funcall accepts an unlimited number of arguments, in C it takes two: the number of Lisp-level arguments, and a one-dimensional array containing their values. The first Lisp-level argument is the Lisp function to call, and the rest are the arguments to pass to it. Since Ffuncall can call the evaluator, you must protect pointers from garbage collection around the call to Ffuncall.

The C functions call0, call1, call2, and so on, provide handy ways to call a Lisp function conveniently with a fixed number of arguments. They work by calling Ffuncall.

eval.c is a very good file to look through for examples; lisp.h contains the definitions for some important macros and functions.

If you define a function which is side-effect free, update the code in byte-opt.el that binds side-effect-free-fns and side-effect-and-error-free-fns so that the compiler optimizer knows about it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.7 Object Internals

Emacs Lisp provides a rich set of the data types. Some of them, like cons cells, integers and strings, are common to nearly all Lisp dialects. Some others, like markers and buffers, are quite special and needed to provide the basic support to write editor commands in Lisp. To implement such a variety of object types and provide an efficient way to pass objects between the subsystems of an interpreter, there is a set of C data structures and a special type to represent the pointers to all of them, which is known as tagged pointer.

In C, the tagged pointer is an object of type Lisp_Object. Any initialized variable of such a type always holds the value of one of the following basic data types: integer, symbol, string, cons cell, float, vectorlike or miscellaneous object. Each of these data types has the corresponding tag value. All tags are enumerated by enum Lisp_Type and placed into a 3-bit bitfield of the Lisp_Object. The rest of the bits is the value itself. Integers are immediate, i.e., directly represented by those value bits, and all other objects are represented by the C pointers to a corresponding object allocated from the heap. Width of the Lisp_Object is platform- and configuration-dependent: usually it’s equal to the width of an underlying platform pointer (i.e., 32-bit on a 32-bit machine and 64-bit on a 64-bit one), but also there is a special configuration where Lisp_Object is 64-bit but all pointers are 32-bit. The latter trick was designed to overcome the limited range of values for Lisp integers on a 32-bit system by using 64-bit long long type for Lisp_Object.

The following C data structures are defined in lisp.h to represent the basic data types beyond integers:

struct Lisp_Cons

Cons cell, an object used to construct lists.

struct Lisp_String

String, the basic object to represent a sequence of characters.

struct Lisp_Vector

Array, a fixed-size set of Lisp objects which may be accessed by an index.

struct Lisp_Symbol

Symbol, the unique-named entity commonly used as an identifier.

struct Lisp_Float

Floating-point value.

union Lisp_Misc

Miscellaneous kinds of objects which don’t fit into any of the above.

These types are the first-class citizens of an internal type system. Since the tag space is limited, all other types are the subtypes of either Lisp_Vectorlike or Lisp_Misc. Vector subtypes are enumerated by enum pvec_type, and nearly all complex objects like windows, buffers, frames, and processes fall into this category. The rest of special types, including markers and overlays, are enumerated by enum Lisp_Misc_Type and form the set of subtypes of Lisp_Misc.

Below there is a description of a few subtypes of Lisp_Vectorlike. Buffer object represents the text to display and edit. Window is the part of display structure which shows the buffer or used as a container to recursively place other windows on the same frame. (Do not confuse Emacs Lisp window object with the window as an entity managed by the user interface system like X; in Emacs terminology, the latter is called frame.) Finally, process object is used to manage the subprocesses.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.7.1 Buffer Internals

Two structures (see buffer.h) are used to represent buffers in C. The buffer_text structure contains fields describing the text of a buffer; the buffer structure holds other fields. In the case of indirect buffers, two or more buffer structures reference the same buffer_text structure.

Here are some of the fields in struct buffer_text:

beg

The address of the buffer contents.

gpt
gpt_byte

The character and byte positions of the buffer gap. See section The Buffer Gap.

z
z_byte

The character and byte positions of the end of the buffer text.

gap_size

The size of buffer’s gap. See section The Buffer Gap.

modiff
save_modiff
chars_modiff
overlay_modiff

These fields count the number of buffer-modification events performed in this buffer. modiff is incremented after each buffer-modification event, and is never otherwise changed; save_modiff contains the value of modiff the last time the buffer was visited or saved; chars_modiff counts only modifications to the characters in the buffer, ignoring all other kinds of changes; and overlay_modiff counts only modifications to the overlays.

beg_unchanged
end_unchanged

The number of characters at the start and end of the text that are known to be unchanged since the last complete redisplay.

unchanged_modified
overlay_unchanged_modified

The values of modiff and overlay_modiff, respectively, after the last complete redisplay. If their current values match modiff or overlay_modiff, that means beg_unchanged and end_unchanged contain no useful information.

markers

The markers that refer to this buffer. This is actually a single marker, and successive elements in its marker chain are the other markers referring to this buffer text.

intervals

The interval tree which records the text properties of this buffer.

Some of the fields of struct buffer are:

header

A header of type struct vectorlike_header is common to all vectorlike objects.

own_text

A struct buffer_text structure that ordinarily holds the buffer contents. In indirect buffers, this field is not used.

text

A pointer to the buffer_text structure for this buffer. In an ordinary buffer, this is the own_text field above. In an indirect buffer, this is the own_text field of the base buffer.

next

A pointer to the next buffer, in the chain of all buffers, including killed buffers. This chain is used only for allocation and garbage collection, in order to collect killed buffers properly.

pt
pt_byte

The character and byte positions of point in a buffer.

begv
begv_byte

The character and byte positions of the beginning of the accessible range of text in the buffer.

zv
zv_byte

The character and byte positions of the end of the accessible range of text in the buffer.

base_buffer

In an indirect buffer, this points to the base buffer. In an ordinary buffer, it is null.

local_flags

This field contains flags indicating that certain variables are local in this buffer. Such variables are declared in the C code using DEFVAR_PER_BUFFER, and their buffer-local bindings are stored in fields in the buffer structure itself. (Some of these fields are described in this table.)

modtime

The modification time of the visited file. It is set when the file is written or read. Before writing the buffer into a file, this field is compared to the modification time of the file to see if the file has changed on disk. See section Buffer Modification.

auto_save_modified

The time when the buffer was last auto-saved.

last_window_start

The window-start position in the buffer as of the last time the buffer was displayed in a window.

clip_changed

This flag indicates that narrowing has changed in the buffer. See section Narrowing.

prevent_redisplay_optimizations_p

This flag indicates that redisplay optimizations should not be used to display this buffer.

overlay_center

This field holds the current overlay center position. See section Managing Overlays.

overlays_before
overlays_after

These fields hold, respectively, a list of overlays that end at or before the current overlay center, and a list of overlays that end after the current overlay center. See section Managing Overlays. overlays_before is sorted in order of decreasing end position, and overlays_after is sorted in order of increasing beginning position.

name

A Lisp string that names the buffer. It is guaranteed to be unique. See section Buffer Names.

save_length

The length of the file this buffer is visiting, when last read or saved. This and other fields concerned with saving are not kept in the buffer_text structure because indirect buffers are never saved.

directory

The directory for expanding relative file names. This is the value of the buffer-local variable default-directory (see section Functions that Expand Filenames).

filename

The name of the file visited in this buffer, or nil. This is the value of the buffer-local variable buffer-file-name (see section Buffer File Name).

undo_list
backed_up
auto_save_file_name
auto_save_file_format
read_only
file_format
file_truename
invisibility_spec
display_count
display_time

These fields store the values of Lisp variables that are automatically buffer-local (see section Buffer-Local Variables), whose corresponding variable names have the additional prefix buffer- and have underscores replaced with dashes. For instance, undo_list stores the value of buffer-undo-list.

mark

The mark for the buffer. The mark is a marker, hence it is also included on the list markers. See section The Mark.

local_var_alist

The association list describing the buffer-local variable bindings of this buffer, not including the built-in buffer-local bindings that have special slots in the buffer object. (Those slots are omitted from this table.) See section Buffer-Local Variables.

major_mode

Symbol naming the major mode of this buffer, e.g., lisp-mode.

mode_name

Pretty name of the major mode, e.g., "Lisp".

keymap
abbrev_table
syntax_table
category_table
display_table

These fields store the buffer’s local keymap (see section Keymaps), abbrev table (see section Abbrev Tables), syntax table (see section Syntax Tables), category table (see section Categories), and display table (see section Display Tables).

downcase_table
upcase_table
case_canon_table

These fields store the conversion tables for converting text to lower case, upper case, and for canonicalizing text for case-fold search. See section The Case Table.

minor_modes

An alist of the minor modes of this buffer.

pt_marker
begv_marker
zv_marker

These fields are only used in an indirect buffer, or in a buffer that is the base of an indirect buffer. Each holds a marker that records pt, begv, and zv respectively, for this buffer when the buffer is not current.

mode_line_format
header_line_format
case_fold_search
tab_width
fill_column
left_margin
auto_fill_function
truncate_lines
word_wrap
ctl_arrow
bidi_display_reordering
bidi_paragraph_direction
selective_display
selective_display_ellipses
overwrite_mode
abbrev_mode
mark_active
enable_multibyte_characters
buffer_file_coding_system
cache_long_line_scans
point_before_scroll
left_fringe_width
right_fringe_width
fringes_outside_margins
scroll_bar_width
indicate_empty_lines
indicate_buffer_boundaries
fringe_indicator_alist
fringe_cursor_alist
scroll_up_aggressively
scroll_down_aggressively
cursor_type
cursor_in_non_selected_windows

These fields store the values of Lisp variables that are automatically buffer-local (see section Buffer-Local Variables), whose corresponding variable names have underscores replaced with dashes. For instance, mode_line_format stores the value of mode-line-format.

last_selected_window

This is the last window that was selected with this buffer in it, or nil if that window no longer displays this buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.7.2 Window Internals

The fields of a window (for a complete list, see the definition of struct window in window.h) include:

frame

The frame that this window is on.

mini_p

Non-nil if this window is a minibuffer window.

parent

Internally, Emacs arranges windows in a tree; each group of siblings has a parent window whose area includes all the siblings. This field points to a window’s parent.

Parent windows do not display buffers, and play little role in display except to shape their child windows. Emacs Lisp programs usually have no access to the parent windows; they operate on the windows at the leaves of the tree, which actually display buffers.

hchild
vchild

These fields contain the window’s leftmost child and its topmost child respectively. hchild is used if the window is subdivided horizontally by child windows, and vchild if it is subdivided vertically. In a live window, only one of hchild, vchild, and buffer (q.v.) is non-nil.

next
prev

The next sibling and previous sibling of this window. next is nil if the window is the right-most or bottom-most in its group; prev is nil if it is the left-most or top-most in its group.

left_col

The left-hand edge of the window, measured in columns, relative to the leftmost column in the frame (column 0).

top_line

The top edge of the window, measured in lines, relative to the topmost line in the frame (line 0).

total_cols
total_lines

The width and height of the window, measured in columns and lines respectively. The width includes the scroll bar and fringes, and/or the separator line on the right of the window (if any).

buffer

The buffer that the window is displaying.

start

A marker pointing to the position in the buffer that is the first character displayed in the window.

pointm

This is the value of point in the current buffer when this window is selected; when it is not selected, it retains its previous value.

force_start

If this flag is non-nil, it says that the window has been scrolled explicitly by the Lisp program. This affects what the next redisplay does if point is off the screen: instead of scrolling the window to show the text around point, it moves point to a location that is on the screen.

frozen_window_start_p

This field is set temporarily to 1 to indicate to redisplay that start of this window should not be changed, even if point gets invisible.

start_at_line_beg

Non-nil means current value of start was the beginning of a line when it was chosen.

use_time

This is the last time that the window was selected. The function get-lru-window uses this field.

sequence_number

A unique number assigned to this window when it was created.

last_modified

The modiff field of the window’s buffer, as of the last time a redisplay completed in this window.

last_overlay_modified

The overlay_modiff field of the window’s buffer, as of the last time a redisplay completed in this window.

last_point

The buffer’s value of point, as of the last time a redisplay completed in this window.

last_had_star

A non-nil value means the window’s buffer was “modified” when the window was last updated.

vertical_scroll_bar

This window’s vertical scroll bar.

left_margin_cols
right_margin_cols

The widths of the left and right margins in this window. A value of nil means no margin.

left_fringe_width
right_fringe_width

The widths of the left and right fringes in this window. A value of nil or t means use the values of the frame.

fringes_outside_margins

A non-nil value means the fringes outside the display margins; othersize they are between the margin and the text.

window_end_pos

This is computed as z minus the buffer position of the last glyph in the current matrix of the window. The value is only valid if window_end_valid is not nil.

window_end_bytepos

The byte position corresponding to window_end_pos.

window_end_vpos

The window-relative vertical position of the line containing window_end_pos.

window_end_valid

This field is set to a non-nil value if window_end_pos is truly valid. This is nil if nontrivial redisplay is pre-empted, since in that case the display that window_end_pos was computed for did not get onto the screen.

cursor

A structure describing where the cursor is in this window.

last_cursor

The value of cursor as of the last redisplay that finished.

phys_cursor

A structure describing where the cursor of this window physically is.

phys_cursor_type
phys_cursor_height
phys_cursor_width

The type, height, and width of the cursor that was last displayed on this window.

phys_cursor_on_p

This field is non-zero if the cursor is physically on.

cursor_off_p

Non-zero means the cursor in this window is logically off. This is used for blinking the cursor.

last_cursor_off_p

This field contains the value of cursor_off_p as of the time of the last redisplay.

must_be_updated_p

This is set to 1 during redisplay when this window must be updated.

hscroll

This is the number of columns that the display in the window is scrolled horizontally to the left. Normally, this is 0.

vscroll

Vertical scroll amount, in pixels. Normally, this is 0.

dedicated

Non-nil if this window is dedicated to its buffer.

display_table

The window’s display table, or nil if none is specified for it.

update_mode_line

Non-nil means this window’s mode line needs to be updated.

base_line_number

The line number of a certain position in the buffer, or nil. This is used for displaying the line number of point in the mode line.

base_line_pos

The position in the buffer for which the line number is known, or nil meaning none is known. If it is a buffer, don’t display the line number as long as the window shows that buffer.

column_number_displayed

The column number currently displayed in this window’s mode line, or nil if column numbers are not being displayed.

current_matrix
desired_matrix

Glyph matrices describing the current and desired display of this window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.7.3 Process Internals

The fields of a process (for a complete list, see the definition of struct Lisp_Process in process.h) include:

name

A string, the name of the process.

command

A list containing the command arguments that were used to start this process. For a network or serial process, it is nil if the process is running or t if the process is stopped.

filter

A function used to accept output from the process.

sentinel

A function called whenever the state of the process changes.

buffer

The associated buffer of the process.

pid

An integer, the operating system’s process ID. Pseudo-processes such as network or serial connections use a value of 0.

childp

A flag, t if this is really a child process. For a network or serial connection, it is a plist based on the arguments to make-network-process or make-serial-process.

mark

A marker indicating the position of the end of the last output from this process inserted into the buffer. This is often but not always the end of the buffer.

kill_without_query

If this is non-zero, killing Emacs while this process is still running does not ask for confirmation about killing the process.

raw_status

The raw process status, as returned by the wait system call.

status

The process status, as process-status should return it.

tick
update_tick

If these two fields are not equal, a change in the status of the process needs to be reported, either by running the sentinel or by inserting a message in the process buffer.

pty_flag

Non-nil if communication with the subprocess uses a pty; nil if it uses a pipe.

infd

The file descriptor for input from the process.

outfd

The file descriptor for output to the process.

tty_name

The name of the terminal that the subprocess is using, or nil if it is using pipes.

decode_coding_system

Coding-system for decoding the input from this process.

decoding_buf

A working buffer for decoding.

decoding_carryover

Size of carryover in decoding.

encode_coding_system

Coding-system for encoding the output to this process.

encoding_buf

A working buffer for encoding.

inherit_coding_system_flag

Flag to set coding-system of the process buffer from the coding system used to decode process output.

type

Symbol indicating the type of process: real, network, serial.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.8 C Integer Types

Here are some guidelines for use of integer types in the Emacs C source code. These guidelines sometimes give competing advice; common sense is advised.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix F Standard Errors

Here is a list of the more important error symbols in standard Emacs, grouped by concept. The list includes each symbol’s message and a cross reference to a description of how the error can occur.

Each error symbol has an set of parent error conditions that is a list of symbols. Normally this list includes the error symbol itself and the symbol error. Occasionally it includes additional symbols, which are intermediate classifications, narrower than error but broader than a single error symbol. For example, all the errors in accessing files have the condition file-error. If we do not say here that a certain error symbol has additional error conditions, that means it has none.

As a special exception, the error symbol quit does not have the condition error, because quitting is not considered an error.

Most of these error symbols are defined in C (mainly data.c), but some are defined in Lisp. For example, the file userlock.el defines the file-locked and file-supersession errors. Several of the specialized Lisp libraries distributed with Emacs define their own error symbols. We do not attempt to list of all those here.

See section Errors, for an explanation of how errors are generated and handled.

error

The message is ‘error’. See section Errors.

quit

The message is ‘Quit’. See section Quitting.

args-out-of-range

The message is ‘Args out of range’. This happens when trying to access an element beyond the range of a sequence, buffer, or other container-like object. See section Sequences, Arrays, and Vectors, and See section Text.

arith-error

The message is ‘Arithmetic error’. This occurs when trying to perform integer division by zero. See section Numeric Conversions, and See section Arithmetic Operations.

beginning-of-buffer

The message is ‘Beginning of buffer’. See section Motion by Characters.

buffer-read-only

The message is ‘Buffer is read-only’. See section Read-Only Buffers.

circular-list

The message is ‘List contains a loop’. This happens when a circular structure is encountered. See section Read Syntax for Circular Objects.

cl-assertion-failed

The message is ‘Assertion failed’. This happens when the cl-assert macro fails a test. See Assertions in Common Lisp Extensions.

coding-system-error

The message is ‘Invalid coding system’. See section Coding Systems in Lisp.

cyclic-function-indirection

The message is ‘Symbol's chain of function indirections contains a loop’. See section Symbol Function Indirection.

cyclic-variable-indirection

The message is ‘Symbol's chain of variable indirections contains a loop’. See section Variable Aliases.

dbus-error

The message is ‘D-Bus error’. This is only defined if Emacs was compiled with D-Bus support. See Errors and Events in D-Bus integration in Emacs.

end-of-buffer

The message is ‘End of buffer’. See section Motion by Characters.

end-of-file

The message is ‘End of file during parsing’. Note that this is not a subcategory of file-error, because it pertains to the Lisp reader, not to file I/O. See section Input Functions.

file-already-exists

This is a subcategory of file-error. See section Writing to Files.

file-date-error

This is a subcategory of file-error. It occurs when copy-file tries and fails to set the last-modification time of the output file. See section Changing File Names and Attributes.

file-error

We do not list the error-strings of this error and its subcategories, because the error message is normally constructed from the data items alone when the error condition file-error is present. Thus, the error-strings are not very relevant. However, these error symbols do have error-message properties, and if no data is provided, the error-message property is used. See section Files.

compression-error

This is a subcategory of file-error, which results from problems handling a compressed file. See section How Programs Do Loading.

file-locked

This is a subcategory of file-error. See section File Locks.

file-supersession

This is a subcategory of file-error. See section Buffer Modification Time.

file-notify-error

This is a subcategory of file-error. It happens, when a file could not be watched for changes. See section Notifications on File Changes.

ftp-error

This is a subcategory of file-error, which results from problems in accessing a remote file using ftp. See Remote Files in The GNU Emacs Manual.

invalid-function

The message is ‘Invalid function’. See section Symbol Function Indirection.

invalid-read-syntax

The message is ‘Invalid read syntax’. See section Printed Representation and Read Syntax.

invalid-regexp

The message is ‘Invalid regexp’. See section Regular Expressions.

mark-inactive

The message is ‘The mark is not active now’. See section The Mark.

no-catch

The message is ‘No catch for tag’. See section Explicit Nonlocal Exits: catch and throw.

scan-error

The message is ‘Scan error’. This happens when certain syntax-parsing functions find invalid syntax or mismatched parentheses. See section Moving over Balanced Expressions, and See section Parsing Expressions.

search-failed

The message is ‘Search failed’. See section Searching and Matching.

setting-constant

The message is ‘Attempt to set a constant symbol’. This happens when attempting to assign values to nil, t, and keyword symbols. See section Variables that Never Change.

text-read-only

The message is ‘Text is read-only’. This is a subcategory of buffer-read-only. See section Properties with Special Meanings.

undefined-color

The message is ‘Undefined color’. See section Color Names.

user-error

The message is the empty string. See section How to Signal an Error.

void-function

The message is ‘Symbol's function definition is void’. See section Accessing Function Cell Contents.

void-variable

The message is ‘Symbol's value as variable is void’. See section Accessing Variable Values.

wrong-number-of-arguments

The message is ‘Wrong number of arguments’. See section Classification of List Forms.

wrong-type-argument

The message is ‘Wrong type argument’. See section Type Predicates.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix G Standard Keymaps

In this section we list some of the more general keymaps. Many of these exist when Emacs is first started, but some are loaded only when the respective feature is accessed.

There are many other, more specialized, maps than these; in particular those associated with major and minor modes. The minibuffer uses several keymaps (see section Minibuffer Commands that Do Completion). For more details on keymaps, see section Keymaps.

2C-mode-map

A sparse keymap for subcommands of the prefix C-x 6.
See Two-Column Editing in The GNU Emacs Manual.

abbrev-map

A sparse keymap for subcommands of the prefix C-x a.
See Defining Abbrevs in The GNU Emacs Manual.

button-buffer-map

A sparse keymap useful for buffers containing buffers.
You may want to use this as a parent keymap. See section Buttons.

button-map

A sparse keymap used by buttons.

ctl-x-4-map

A sparse keymap for subcommands of the prefix C-x 4.

ctl-x-5-map

A sparse keymap for subcommands of the prefix C-x 5.

ctl-x-map

A full keymap for C-x commands.

ctl-x-r-map

A sparse keymap for subcommands of the prefix C-x r.
See Registers in The GNU Emacs Manual.

esc-map

A full keymap for ESC (or Meta) commands.

facemenu-keymap

A sparse keymap used for the M-o prefix key.

function-key-map

The parent keymap of all local-function-key-map (q.v.) instances.

global-map

The full keymap containing default global key bindings.
Modes should not modify the Global map.

goto-map

A sparse keymap used for the M-g prefix key.

help-map

A sparse keymap for the keys following the help character C-h.
See section Help Functions.

Helper-help-map

A full keymap used by the help utility package.
It has the same keymap in its value cell and in its function cell.

input-decode-map

The keymap for translating keypad and function keys.
If there are none, then it contains an empty sparse keymap. See section Keymaps for Translating Sequences of Events.

key-translation-map

A keymap for translating keys. This one overrides ordinary key bindings, unlike local-function-key-map. See section Keymaps for Translating Sequences of Events.

kmacro-keymap

A sparse keymap for keys that follows the C-x C-k prefix search.
See Keyboard Macros in The GNU Emacs Manual.

local-function-key-map

The keymap for translating key sequences to preferred alternatives.
If there are none, then it contains an empty sparse keymap. See section Keymaps for Translating Sequences of Events.

menu-bar-file-menu
menu-bar-edit-menu
menu-bar-options-menu
global-buffers-menu-map
menu-bar-tools-menu
menu-bar-help-menu

These keymaps display the main, top-level menus in the menu bar.
Some of them contain sub-menus. For example, the Edit menu contains menu-bar-search-menu, etc. See section The Menu Bar.

minibuffer-inactive-mode-map

A full keymap used in the minibuffer when it is not active.
See Editing in the Minibuffer in The GNU Emacs Manual.

mode-line-coding-system-map
mode-line-input-method-map
mode-line-column-line-number-mode-map

These keymaps control various areas of the mode line.
See section Mode Line Format.

mode-specific-map

The keymap for characters following C-c. Note, this is in the global map. This map is not actually mode-specific: its name was chosen to be informative in C-h b (display-bindings), where it describes the main use of the C-c prefix key.

mouse-appearance-menu-map

A sparse keymap used for the S-mouse-1 key.

mule-keymap

The global keymap used for the C-x RET prefix key.

narrow-map

A sparse keymap for subcommands of the prefix C-x n.

prog-mode-map

The keymap used by Prog mode.
See section Basic Major Modes.

query-replace-map
multi-query-replace-map

A sparse keymap used for responses in query-replace and related commands; also for y-or-n-p and map-y-or-n-p. The functions that use this map do not support prefix keys; they look up one event at a time. multi-query-replace-map extends query-replace-map for multi-buffer replacements. See section query-replace-map.

search-map

A sparse keymap that provides global bindings for search-related commands.

special-mode-map

The keymap used by Special mode.
See section Basic Major Modes.

tool-bar-map

The keymap defining the contents of the tool bar.
See section Tool bars.

universal-argument-map

A sparse keymap used while processing C-u.
See section Prefix Command Arguments.

vc-prefix-map

The global keymap used for the C-x v prefix key.

x-alternatives-map

A sparse keymap used to map certain keys under graphical frames.
The function x-setup-function-keys uses this.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix H Standard Hooks

The following is a list of some hook variables that let you provide functions to be called from within Emacs on suitable occasions.

Most of these variables have names ending with ‘-hook’. They are normal hooks, run by means of run-hooks. The value of such a hook is a list of functions; the functions are called with no arguments and their values are completely ignored. The recommended way to put a new function on such a hook is to call add-hook. See section Hooks, for more information about using hooks.

The variables whose names end in ‘-functions’ are usually abnormal hooks (some old code may also use the deprecated ‘-hooks’ suffix); their values are lists of functions, but these functions are called in a special way (they are passed arguments, or their return values are used). The variables whose names end in ‘-function’ have single functions as their values.

This is not an exhaustive list, it only covers the more general hooks. For example, every major mode defines a hook named ‘modename-mode-hook’. The major mode command runs this normal hook with run-mode-hooks as the very last thing it does. See section Mode Hooks. Most minor modes have mode hooks too.

A special feature allows you to specify expressions to evaluate if and when a file is loaded (see section Hooks for Loading). That feature is not exactly a hook, but does a similar job.

activate-mark-hook
deactivate-mark-hook

See section The Mark.

after-change-functions
before-change-functions
first-change-hook

See section Change Hooks.

after-change-major-mode-hook
change-major-mode-after-body-hook

See section Mode Hooks.

after-init-hook
before-init-hook
emacs-startup-hook
window-setup-hook

See section The Init File.

after-insert-file-functions
write-region-annotate-functions
write-region-post-annotation-function

See section File Format Conversion.

after-make-frame-functions
before-make-frame-hook

See section Creating Frames.

after-save-hook
before-save-hook
write-contents-functions
write-file-functions

See section Saving Buffers.

after-setting-font-hook

Hook run after a frame’s font changes.

auto-save-hook

See section Auto-Saving.

before-hack-local-variables-hook
hack-local-variables-hook

See section File Local Variables.

buffer-access-fontify-functions

See section Lazy Computation of Text Properties.

buffer-list-update-hook

Hook run when the buffer list changes (see section The Buffer List).

buffer-quit-function

Function to call to “quit” the current buffer.

change-major-mode-hook

See section Creating and Deleting Buffer-Local Bindings.

command-line-functions

See section Command-Line Arguments.

delayed-warnings-hook

The command loop runs this soon after post-command-hook (q.v.).

focus-in-hook
focus-out-hook

See section Input Focus.

delete-frame-functions

See section Deleting Frames.

delete-terminal-functions

See section Multiple Terminals.

pop-up-frame-function
split-window-preferred-function

See section Additional Options for Displaying Buffers.

echo-area-clear-hook

See section Echo Area Customization.

find-file-hook
find-file-not-found-functions

See section Functions for Visiting Files.

font-lock-extend-after-change-region-function

See section Region to Fontify after a Buffer Change.

font-lock-extend-region-functions

See section Multiline Font Lock Constructs.

font-lock-fontify-buffer-function
font-lock-fontify-region-function
font-lock-mark-block-function
font-lock-unfontify-buffer-function
font-lock-unfontify-region-function

See section Other Font Lock Variables.

fontification-functions

See section Automatic Face Assignment.

frame-auto-hide-function

See section Quitting Windows.

kill-buffer-hook
kill-buffer-query-functions

See section Killing Buffers.

kill-emacs-hook
kill-emacs-query-functions

See section Killing Emacs.

menu-bar-update-hook

See section The Menu Bar.

minibuffer-setup-hook
minibuffer-exit-hook

See section Minibuffer Miscellany.

mouse-leave-buffer-hook

Hook run when about to switch windows with a mouse command.

mouse-position-function

See section Mouse Position.

post-command-hook
pre-command-hook

See section Command Loop Overview.

post-gc-hook

See section Garbage Collection.

post-self-insert-hook

See section Keymaps and Minor Modes.

suspend-hook
suspend-resume-hook
suspend-tty-functions
resume-tty-functions

See section Suspending Emacs.

syntax-begin-function
syntax-propertize-extend-region-functions
syntax-propertize-function
font-lock-syntactic-face-function

See section Syntactic Font Lock. See section Syntax Properties.

temp-buffer-setup-hook
temp-buffer-show-function
temp-buffer-show-hook

See section Temporary Displays.

tty-setup-hook

See section Terminal-Specific Initialization.

window-configuration-change-hook
window-scroll-functions
window-size-change-functions

See section Hooks for Window Scrolling and Changes.

window-text-change-functions

Functions to call in redisplay when text in the window might change.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Index

Jump to:   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   1   2   3   ;   <   =   >   ?   @   [   \   ]   ^   `   |  
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z  
Index Entry  Section

"
"’ in printing 18.5 Output Functions
"’ in strings 2.3.8.1 Syntax for Strings

#
##’ read syntax 2.3.4 Symbol Type
#$ 16.3 Documentation Strings and Compilation
#'’ syntax 12.7 Anonymous Functions
#(’ read syntax 2.3.8.4 Text Properties in Strings
#:’ read syntax 2.3.4 Symbol Type
#@count 16.3 Documentation Strings and Compilation
#n#’ read syntax 2.5 Read Syntax for Circular Objects
#n=’ read syntax 2.5 Read Syntax for Circular Objects
#^’ read syntax 2.3.10 Char-Table Type

$
$’ in display 37.3 Truncation
$’ in regexp 33.3.1.1 Special Characters in Regular Expressions

%
% 3.6 Arithmetic Operations
%’ in format 4.7 Formatting Strings

&
&’ in replacement 33.6.1 Replacing the Text that Matched
&optional 12.2.3 Other Features of Argument Lists
&rest 12.2.3 Other Features of Argument Lists

'
'’ for quoting 9.3 Quoting

(
(’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
(…)’ in lists 2.3.6 Cons Cell and List Types
(?:’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions

)
)’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions

*
* 3.6 Arithmetic Operations
*’ in interactive 20.2.1 Using interactive
*’ in regexp 33.3.1.1 Special Characters in Regular Expressions
*scratch* 22.2.2 How Emacs Chooses a Major Mode

+
+ 3.6 Arithmetic Operations
+’ in regexp 33.3.1.1 Special Characters in Regular Expressions

,
, (with backquote) 9.4 Backquote
,@ (with backquote) 9.4 Backquote

-
- 3.6 Arithmetic Operations
--enable-locallisppath option to configure E.1 Building Emacs
–enable-profiling option of configure 17.5 Profiling

.
.’ in lists 2.3.6.2 Dotted Pair Notation
.’ in regexp 33.3.1.1 Special Characters in Regular Expressions
.emacs 38.1.2 The Init File

/
/ 3.6 Arithmetic Operations
/= 3.4 Comparison of Numbers
/dev/tty 36.19 Communicating with Serial Ports

1
1+ 3.6 Arithmetic Operations
1- 3.6 Arithmetic Operations
1value 17.4 Test Coverage

2
2C-mode-map 21.6 Prefix Keys
2D box 37.12.1 Face Attributes

3
3D box 37.12.1 Face Attributes

;
;’ in comment 2.2 Comments

<
< 3.4 Comparison of Numbers
<= 3.4 Comparison of Numbers

=
= 3.4 Comparison of Numbers

>
> 3.4 Comparison of Numbers
>= 3.4 Comparison of Numbers

?
?’ in character constant 2.3.3.1 Basic Char Syntax
? in minibuffer 19.2 Reading Text Strings with the Minibuffer
?’ in regexp 33.3.1.1 Special Characters in Regular Expressions

@
@’ in interactive 20.2.1 Using interactive

[
[’ in regexp 33.3.1.1 Special Characters in Regular Expressions
[…] (Edebug) 17.2.15.2 Specification List

\
\’ in character constant 2.3.3.2 General Escape Syntax
\’ in display 37.3 Truncation
\’ in printing 18.5 Output Functions
\’ in regexp 33.3.1.1 Special Characters in Regular Expressions
\’ in replacement 33.6.1 Replacing the Text that Matched
\’ in strings 2.3.8.1 Syntax for Strings
\’ in symbols 2.3.4 Symbol Type
\'’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\<’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\=’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\>’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\a 2.3.3.1 Basic Char Syntax
\b 2.3.3.1 Basic Char Syntax
\b’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\B’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\e 2.3.3.1 Basic Char Syntax
\f 2.3.3.1 Basic Char Syntax
\n 2.3.3.1 Basic Char Syntax
\n’ in print 18.6 Variables Affecting Output
\n’ in replacement 33.6.1 Replacing the Text that Matched
\r 2.3.3.1 Basic Char Syntax
\s 2.3.3.1 Basic Char Syntax
\s’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\S’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\t 2.3.3.1 Basic Char Syntax
\v 2.3.3.1 Basic Char Syntax
\w’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\W’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\_<’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\_>’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\`’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions

]
]’ in regexp 33.3.1.1 Special Characters in Regular Expressions

^
^’ in interactive 20.2.1 Using interactive
^’ in regexp 33.3.1.1 Special Characters in Regular Expressions

`
` 9.4 Backquote
‘ (list substitution) 9.4 Backquote

|
|’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions

A
abbrev 35 Abbrevs and Abbrev Expansion
abbrev properties 35.6 Abbrev Properties
abbrev table properties 35.7 Abbrev Table Properties
abbrev tables 35.1 Abbrev Tables
abbrev tables in modes 22.2.1 Major Mode Conventions
abbrev-all-caps 35.4 Looking Up and Expanding Abbreviations
abbrev-expand-function 35.4 Looking Up and Expanding Abbreviations
abbrev-expansion 35.4 Looking Up and Expanding Abbreviations
abbrev-file-name 35.3 Saving Abbrevs in Files
abbrev-get 35.6 Abbrev Properties
abbrev-insert 35.4 Looking Up and Expanding Abbreviations
abbrev-map Appendix G Standard Keymaps
abbrev-minor-mode-table-alist 35.5 Standard Abbrev Tables
abbrev-prefix-mark 35.4 Looking Up and Expanding Abbreviations
abbrev-put 35.6 Abbrev Properties
abbrev-start-location 35.4 Looking Up and Expanding Abbreviations
abbrev-start-location-buffer 35.4 Looking Up and Expanding Abbreviations
abbrev-symbol 35.4 Looking Up and Expanding Abbreviations
abbrev-table-get 35.7 Abbrev Table Properties
abbrev-table-name-list 35.1 Abbrev Tables
abbrev-table-p 35.1 Abbrev Tables
abbrev-table-put 35.7 Abbrev Table Properties
abbreviate-file-name 24.8.3 Directory Names
abbreviated file names 24.8.3 Directory Names
abbrevs, looking up and expanding 35.4 Looking Up and Expanding Abbreviations
abbrevs-changed 35.3 Saving Abbrevs in Files
abnormal hook 22.1 Hooks
abort-recursive-edit 20.13 Recursive Editing
aborting 20.13 Recursive Editing
abs 3.4 Comparison of Numbers
absolute file name 24.8.2 Absolute and Relative File Names
accept input from processes 36.9.4 Accepting Output from Processes
accept-change-group 31.27 Atomic Change Groups
accept-process-output 36.9.4 Accepting Output from Processes
access control list 24.6.5 Extended File Attributes
access minibuffer contents 19.12 Minibuffer Contents
access-file 24.6.1 Testing Accessibility
accessibility of a file 24.6.1 Testing Accessibility
accessible portion (of a buffer) 29.4 Narrowing
accessible-keymaps 21.16 Scanning Keymaps
accessing documentation strings 23.2 Access to Documentation Strings
accessing hash tables 7.2 Hash Table Access
accessing plist properties 5.9.2 Property Lists Outside Symbols
ACL entries 24.6.5 Extended File Attributes
acos 3.9 Standard Mathematical Functions
action (button property) 37.18.1 Button Properties
action alist, for display-buffer 27.12 Choosing a Window for Display
action function, for display-buffer 27.12 Choosing a Window for Display
action, customization keyword 14.4.4 Type Keywords
activate-change-group 31.27 Atomic Change Groups
activate-mark-hook 30.7 The Mark
active display table 37.21.3 Active Display Table
active keymap 21.7 Active Keymaps
active keymap, controlling 21.9 Controlling the Active Keymaps
active-minibuffer-window 19.11 Minibuffer Windows
adaptive-fill-first-line-regexp 31.13 Adaptive Fill Mode
adaptive-fill-function 31.13 Adaptive Fill Mode
adaptive-fill-mode 31.13 Adaptive Fill Mode
adaptive-fill-regexp 31.13 Adaptive Fill Mode
add-face-text-property 31.19.2 Changing Text Properties
add-function 12.10.1 Primitives to manipulate advices
add-hook 22.1.2 Setting Hooks
add-name-to-file 24.7 Changing File Names and Attributes
add-text-properties 31.19.2 Changing Text Properties
add-to-history 19.4 Minibuffer History
add-to-invisibility-spec 37.6 Invisible Text
add-to-list 5.5 Modifying List Variables
add-to-ordered-list 5.5 Modifying List Variables
address field of register 2.3.6 Cons Cell and List Types
adjust-window-trailing-edge 27.4 Resizing Windows
adjusting point 20.6 Adjusting Point After Commands
advertised binding 23.3 Substituting Key Bindings in Documentation
advice, add and remove 12.10.1 Primitives to manipulate advices
advice-add 12.10.2 Advising Named Functions
advice-eval-interactive-spec 12.10.1 Primitives to manipulate advices
advice-function-mapc 12.10.1 Primitives to manipulate advices
advice-function-member-p 12.10.1 Primitives to manipulate advices
advice-mapc 12.10.2 Advising Named Functions
advice-member-p 12.10.2 Advising Named Functions
advice-remove 12.10.2 Advising Named Functions
advising functions 12.10 Advising Emacs Lisp Functions
advising named functions 12.10.2 Advising Named Functions
after-change-functions 31.28 Change Hooks
after-change-major-mode-hook 22.2.6 Mode Hooks
after-find-file 24.1.2 Subroutines of Visiting
after-init-hook 38.1.2 The Init File
after-init-time 38.1.1 Summary: Sequence of Actions at Startup
after-insert-file-functions 24.12.3 Piecemeal Specification
after-load-functions 15.10 Hooks for Loading
after-make-frame-functions 28.1 Creating Frames
after-revert-hook 25.3 Reverting
after-save-hook 24.2 Saving Buffers
after-setting-font-hook Appendix H Standard Hooks
after-string (overlay property) 37.9.2 Overlay Properties
alias, for coding systems 32.10.1 Basic Concepts of Coding Systems
alias, for faces 37.12.6 Functions for Working with Faces
alias, for functions 12.4 Defining Functions
alias, for variables 11.13 Variable Aliases
alist 5.8 Association Lists
alist vs. plist 5.9.1 Property Lists and Association Lists
all-completions 19.6.1 Basic Completion Functions
alpha, a frame parameter 28.3.3.8 Font and Color Parameters
alt characters 2.3.3.5 Other Character Modifier Bits
alternatives, defining 20.2.4 Select among Command Alternatives
and 10.3 Constructs for Combining Conditions
animation 37.17.10 Multi-Frame Images
anonymous face 37.12 Faces
anonymous function 12.7 Anonymous Functions
apostrophe for quoting 9.3 Quoting
append 5.4 Building Cons Cells and Lists
append-to-file 24.4 Writing to Files
apply 12.5 Calling Functions
apply, and debugging 17.1.8 Internals of the Debugger
apply-partially 12.5 Calling Functions
applying customizations 14.5 Applying Customizations
apropos 23.5 Help Functions
aref 6.3 Functions that Operate on Arrays
args, customization keyword 14.4.2 Composite Types
argument 12.1 What Is a Function?
argument binding 12.2.3 Other Features of Argument Lists
argument lists, features 12.2.3 Other Features of Argument Lists
arguments for shell commands 36.2 Shell Arguments
arguments, interactive entry 20.2.1 Using interactive
arguments, reading 19 Minibuffers
argv 38.1.4 Command-Line Arguments
arith-error example 10.5.3.3 Writing Code to Handle Errors
arith-error in division 3.6 Arithmetic Operations
arithmetic operations 3.6 Arithmetic Operations
arithmetic shift 3.8 Bitwise Operations on Integers
array 6.2 Arrays
array elements 6.3 Functions that Operate on Arrays
arrayp 6.3 Functions that Operate on Arrays
ASCII character codes 2.3.3 Character Type
ASCII control characters 37.21.1 Usual Display Conventions
ascii-case-table 4.9 The Case Table
aset 6.3 Functions that Operate on Arrays
ash 3.8 Bitwise Operations on Integers
asin 3.9 Standard Mathematical Functions
ask-user-about-lock 24.5 File Locks
ask-user-about-supersession-threat 26.6 Buffer Modification Time
asking the user questions 19.7 Yes-or-No Queries
assoc 5.8 Association Lists
assoc-default 5.8 Association Lists
assoc-string 4.5 Comparison of Characters and Strings
association list 5.8 Association Lists
assq 5.8 Association Lists
assq-delete-all 5.8 Association Lists
asynchronous subprocess 36.4 Creating an Asynchronous Process
atan 3.9 Standard Mathematical Functions
atom 5.2 Predicates on Lists
atomic changes 31.27 Atomic Change Groups
atoms 2.3.6 Cons Cell and List Types
attributes of text 31.19 Text Properties
Auto Fill mode 31.14 Auto Filling
auto-coding-alist 32.10.5 Default Coding Systems
auto-coding-functions 32.10.5 Default Coding Systems
auto-coding-regexp-alist 32.10.5 Default Coding Systems
auto-fill-chars 31.14 Auto Filling
auto-fill-function 31.14 Auto Filling
auto-hscroll-mode 27.22 Horizontal Scrolling
auto-lower, a frame parameter 28.3.3.6 Window Management Parameters
auto-mode-alist 22.2.2 How Emacs Chooses a Major Mode
auto-raise, a frame parameter 28.3.3.6 Window Management Parameters
auto-raise-tool-bar-buttons 21.17.6 Tool bars
auto-resize-tool-bars 21.17.6 Tool bars
auto-save-default 25.2 Auto-Saving
auto-save-file-name-p 25.2 Auto-Saving
auto-save-hook 25.2 Auto-Saving
auto-save-interval 25.2 Auto-Saving
auto-save-list-file-name 25.2 Auto-Saving
auto-save-list-file-prefix 25.2 Auto-Saving
auto-save-mode 25.2 Auto-Saving
auto-save-timeout 25.2 Auto-Saving
auto-save-visited-file-name 25.2 Auto-Saving
auto-window-vscroll 27.21 Vertical Fractional Scrolling
autoload 15.5 Autoload
autoload 15.5 Autoload
autoload cookie 15.5 Autoload
autoload errors 15.5 Autoload
autoload object 12.1 What Is a Function?
autoload-do-load 15.5 Autoload
autoloadp 15.5 Autoload
automatic face assignment 37.12.7 Automatic Face Assignment
automatically buffer-local 11.10.1 Introduction to Buffer-Local Variables

B
back-to-indentation 31.17.6 Indentation-Based Motion Commands
background-color, a frame parameter 28.3.3.8 Font and Color Parameters
background-mode, a frame parameter 28.3.3.8 Font and Color Parameters
backing store 28.23 Display Feature Testing
backquote (list substitution) 9.4 Backquote
backslash in character constants 2.3.3.2 General Escape Syntax
backslash in regular expressions 33.3.1.3 Backslash Constructs in Regular Expressions
backslash in strings 2.3.8.1 Syntax for Strings
backslash in symbols 2.3.4 Symbol Type
backspace 2.3.3.1 Basic Char Syntax
backtrace 17.1.8 Internals of the Debugger
backtrace-debug 17.1.8 Internals of the Debugger
backtrace-frame 17.1.8 Internals of the Debugger
backtracking 17.2.15.3 Backtracking in Specifications
backtracking and POSIX regular expressions 33.5 POSIX Regular Expression Searching
backtracking and regular expressions 33.3.1.1 Special Characters in Regular Expressions
backup file 25.1 Backup Files
backup files, rename or copy 25.1.2 Backup by Renaming or by Copying?
backup-buffer 25.1.1 Making Backup Files
backup-by-copying 25.1.2 Backup by Renaming or by Copying?
backup-by-copying-when-linked 25.1.2 Backup by Renaming or by Copying?
backup-by-copying-when-mismatch 25.1.2 Backup by Renaming or by Copying?
backup-by-copying-when-privileged-mismatch 25.1.2 Backup by Renaming or by Copying?
backup-directory-alist 25.1.1 Making Backup Files
backup-enable-predicate 25.1.1 Making Backup Files
backup-file-name-p 25.1.4 Naming Backup Files
backup-inhibited 25.1.1 Making Backup Files
backups and auto-saving 25 Backups and Auto-Saving
backward-button 37.18.5 Button Buffer Commands
backward-char 29.2.1 Motion by Characters
backward-delete-char-untabify 31.6 Deleting Text
backward-delete-char-untabify-method 31.6 Deleting Text
backward-list 29.2.6 Moving over Balanced Expressions
backward-prefix-chars 34.5 Motion and Syntax
backward-sexp 29.2.6 Moving over Balanced Expressions
backward-to-indentation 31.17.6 Indentation-Based Motion Commands
backward-word 29.2.2 Motion by Words
balance-windows 27.4 Resizing Windows
balance-windows-area 27.4 Resizing Windows
balanced parenthesis motion 29.2.6 Moving over Balanced Expressions
balancing parentheses 37.20 Blinking Parentheses
balancing window sizes 27.4 Resizing Windows
barf-if-buffer-read-only 26.7 Read-Only Buffers
base 64 encoding 31.24 Base 64 Encoding
base buffer 26.11 Indirect Buffers
base coding system 32.10.1 Basic Concepts of Coding Systems
base direction of a paragraph 37.24 Bidirectional Display
base for reading an integer 3.1 Integer Basics
base location, package archive 39.4 Creating and Maintaining Package Archives
base remapping, faces 37.12.5 Face Remapping
base64-decode-region 31.24 Base 64 Encoding
base64-decode-string 31.24 Base 64 Encoding
base64-encode-region 31.24 Base 64 Encoding
base64-encode-string 31.24 Base 64 Encoding
basic code (of input character) 20.7.1 Keyboard Events
basic faces 37.12.8 Basic Faces
batch mode 38.16 Batch Mode
batch-byte-compile 16.2 Byte-Compilation Functions
baud, in serial connections 36.19 Communicating with Serial Ports
baud-rate 38.13 Terminal Output
beep 37.22 Beeping
before point, insertion 31.4 Inserting Text
before-change-functions 31.28 Change Hooks
before-hack-local-variables-hook 11.11 File Local Variables
before-init-hook 38.1.2 The Init File
before-init-time 38.1.1 Summary: Sequence of Actions at Startup
before-make-frame-hook 28.1 Creating Frames
before-revert-hook 25.3 Reverting
before-save-hook 24.2 Saving Buffers
before-string (overlay property) 37.9.2 Overlay Properties
beginning of line 29.2.4 Motion by Text Lines
beginning of line in regexp 33.3.1.1 Special Characters in Regular Expressions
beginning-of-buffer 29.2.3 Motion to an End of the Buffer
beginning-of-defun 29.2.6 Moving over Balanced Expressions
beginning-of-defun-function 29.2.6 Moving over Balanced Expressions
beginning-of-line 29.2.4 Motion by Text Lines
bell 37.22 Beeping
bell character 2.3.3.1 Basic Char Syntax
benchmark.el 17.5 Profiling
benchmarking 17.5 Profiling
bidi-display-reordering 37.24 Bidirectional Display
bidi-paragraph-direction 37.24 Bidirectional Display
bidi-string-mark-left-to-right 37.24 Bidirectional Display
bidirectional class of characters 32.6 Character Properties
bidirectional display 37.24 Bidirectional Display
bidirectional reordering 37.24 Bidirectional Display
big endian 36.20.1 Describing Data Layout
binary coding system 32.10.1 Basic Concepts of Coding Systems
bindat-get-field 36.20.2 Functions to Unpack and Pack Bytes
bindat-ip-to-string 36.20.2 Functions to Unpack and Pack Bytes
bindat-length 36.20.2 Functions to Unpack and Pack Bytes
bindat-pack 36.20.2 Functions to Unpack and Pack Bytes
bindat-unpack 36.20.2 Functions to Unpack and Pack Bytes
binding arguments 12.2.3 Other Features of Argument Lists
binding local variables 11.3 Local Variables
binding of a key 21.2 Keymap Basics
bitmap-spec-p 37.12.1 Face Attributes
bitmaps, fringe 37.13.4 Fringe Bitmaps
bitwise arithmetic 3.8 Bitwise Operations on Integers
blink-cursor-alist 28.3.3.7 Cursor Parameters
blink-matching-delay 37.20 Blinking Parentheses
blink-matching-open 37.20 Blinking Parentheses
blink-matching-paren 37.20 Blinking Parentheses
blink-matching-paren-distance 37.20 Blinking Parentheses
blink-paren-function 37.20 Blinking Parentheses
blinking parentheses 37.20 Blinking Parentheses
bobp 31.1 Examining Text Near Point
body height of a window 27.3 Window Sizes
body of a window 27.3 Window Sizes
body of function 12.2.1 Components of a Lambda Expression
body size of a window 27.3 Window Sizes
body width of a window 27.3 Window Sizes
bolp 31.1 Examining Text Near Point
bool-vector-count-consecutive 6.7 Bool-vectors
bool-vector-count-population 6.7 Bool-vectors
bool-vector-exclusive-or 6.7 Bool-vectors
bool-vector-intersection 6.7 Bool-vectors
bool-vector-not 6.7 Bool-vectors
bool-vector-p 6.7 Bool-vectors
bool-vector-set-difference 6.7 Bool-vectors
bool-vector-subsetp 6.7 Bool-vectors
bool-vector-union 6.7 Bool-vectors
Bool-vectors 6.7 Bool-vectors
boolean 1.3.2 nil and t
booleanp 1.3.2 nil and t
border-color, a frame parameter 28.3.3.8 Font and Color Parameters
border-width, a frame parameter 28.3.3.4 Layout Parameters
bottom dividers 37.15 Window Dividers
bottom-divider-width, a frame parameter 28.3.3.4 Layout Parameters
boundp 11.4 When a Variable is “Void”
box diagrams, for lists 2.3.6.1 Drawing Lists as Box Diagrams
break 17.1 The Lisp Debugger
breakpoints (Edebug) 17.2.6.1 Edebug Breakpoints
bucket (in obarray) 8.3 Creating and Interning Symbols
buffer 26 Buffers
buffer boundaries, indicating 37.13.2 Fringe Indicators
buffer contents 31 Text
buffer file name 26.4 Buffer File Name
buffer gap 26.13 The Buffer Gap
buffer input stream 18.2 Input Streams
buffer internals E.7.1 Buffer Internals
buffer list 26.8 The Buffer List
buffer modification 26.5 Buffer Modification
buffer names 26.3 Buffer Names
buffer output stream 18.4 Output Streams
buffer portion as string 31.2 Examining Buffer Contents
buffer position 29 Positions
buffer text notation 1.3.6 Buffer Text Notation
buffer, read-only 26.7 Read-Only Buffers
buffer-access-fontified-property 31.19.7 Lazy Computation of Text Properties
buffer-access-fontify-functions 31.19.7 Lazy Computation of Text Properties
buffer-auto-save-file-format 24.12.2 Round-Trip Specification
buffer-auto-save-file-name 25.2 Auto-Saving
buffer-backed-up 25.1.1 Making Backup Files
buffer-base-buffer 26.11 Indirect Buffers
buffer-chars-modified-tick 26.5 Buffer Modification
buffer-disable-undo 31.10 Maintaining Undo Lists
buffer-display-count 27.10 Buffers and Windows
buffer-display-table 37.21.3 Active Display Table
buffer-display-time 27.10 Buffers and Windows
buffer-enable-undo 31.10 Maintaining Undo Lists
buffer-end 29.1 Point
buffer-file-coding-system 32.10.2 Encoding and I/O
buffer-file-format 24.12.2 Round-Trip Specification
buffer-file-name 26.4 Buffer File Name
buffer-file-name 26.4 Buffer File Name
buffer-file-number 26.4 Buffer File Name
buffer-file-truename 26.4 Buffer File Name
buffer-invisibility-spec 37.6 Invisible Text
buffer-list 26.8 The Buffer List
buffer-list, a frame parameter 28.3.3.5 Buffer Parameters
buffer-list-update-hook 26.8 The Buffer List
buffer-list-update-hook Appendix H Standard Hooks
buffer-live-p 26.10 Killing Buffers
buffer-local variables 11.10 Buffer-Local Variables
buffer-local variables in modes 22.2.1 Major Mode Conventions
buffer-local-value 11.10.2 Creating and Deleting Buffer-Local Bindings
buffer-local-variables 11.10.2 Creating and Deleting Buffer-Local Bindings
buffer-modified-p 26.5 Buffer Modification
buffer-modified-tick 26.5 Buffer Modification
buffer-name 26.3 Buffer Names
buffer-name-history 19.4 Minibuffer History
buffer-narrowed-p 29.4 Narrowing
buffer-offer-save 26.10 Killing Buffers
buffer-predicate, a frame parameter 28.3.3.5 Buffer Parameters
buffer-quit-function Appendix H Standard Hooks
buffer-read-only 26.7 Read-Only Buffers
buffer-save-without-query 26.10 Killing Buffers
buffer-saved-size 25.2 Auto-Saving
buffer-size 29.1 Point
buffer-stale-function 25.3 Reverting
buffer-string 31.2 Examining Buffer Contents
buffer-substring 31.2 Examining Buffer Contents
buffer-substring-filters 31.2 Examining Buffer Contents
buffer-substring-no-properties 31.2 Examining Buffer Contents
buffer-swap-text 26.12 Swapping Text Between Two Buffers
buffer-undo-list 31.9 Undo
bufferp 26.1 Buffer Basics
buffers to display on frame 28.3.3.5 Buffer Parameters
buffers without undo information 26.3 Buffer Names
buffers, controlled in windows 27.10 Buffers and Windows
buffers, creating 26.9 Creating Buffers
buffers, killing 26.10 Killing Buffers
bugs 1.1 Caveats
bugs in this manual 1.1 Caveats
building Emacs E.1 Building Emacs
building lists 5.4 Building Cons Cells and Lists
built-in function 12.1 What Is a Function?
bury-buffer 26.8 The Buffer List
butlast 5.3 Accessing Elements of Lists
button (button property) 37.18.1 Button Properties
button buffer commands 37.18.5 Button Buffer Commands
button properties 37.18.1 Button Properties
button types 37.18.2 Button Types
button-activate 37.18.4 Manipulating Buttons
button-at 37.18.4 Manipulating Buttons
button-down event 20.7.6 Button-Down Events
button-end 37.18.4 Manipulating Buttons
button-face, customization keyword 14.4.4 Type Keywords
button-get 37.18.4 Manipulating Buttons
button-has-type-p 37.18.4 Manipulating Buttons
button-label 37.18.4 Manipulating Buttons
button-prefix, customization keyword 14.4.4 Type Keywords
button-put 37.18.4 Manipulating Buttons
button-start 37.18.4 Manipulating Buttons
button-suffix, customization keyword 14.4.4 Type Keywords
button-type 37.18.4 Manipulating Buttons
button-type-get 37.18.4 Manipulating Buttons
button-type-put 37.18.4 Manipulating Buttons
button-type-subtype-p 37.18.4 Manipulating Buttons
buttons in buffers 37.18 Buttons
byte compilation 16 Byte Compilation
byte compiler warnings, how to avoid D.5 Tips for Avoiding Compiler Warnings
byte packing and unpacking 36.20 Packing and Unpacking Byte Arrays
byte to string 32.3 Converting Text Representations
byte-boolean-vars 11.14 Variables with Restricted Values
byte-boolean-vars E.6 Writing Emacs Primitives
byte-code 16 Byte Compilation
byte-code function 16.7 Byte-Code Function Objects
byte-code object 16.7 Byte-Code Function Objects
byte-code-function-p 12.1 What Is a Function?
byte-compile 16.2 Byte-Compilation Functions
byte-compile-dynamic 16.4 Dynamic Loading of Individual Functions
byte-compile-dynamic-docstrings 16.3 Documentation Strings and Compilation
byte-compile-file 16.2 Byte-Compilation Functions
byte-compiling macros 13.3 Macros and Byte Compilation
byte-compiling require 15.7 Features
byte-recompile-directory 16.2 Byte-Compilation Functions
byte-to-position 32.1 Text Representations
byte-to-string 32.3 Converting Text Representations
bytes 4 Strings and Characters
bytesize, in serial connections 36.19 Communicating with Serial Ports

C
C programming language E.5 C Dialect
C-c 21.6 Prefix Keys
C-g 20.11 Quitting
C-h 21.6 Prefix Keys
C-M-x 17.2.2 Instrumenting for Edebug
C-x 21.6 Prefix Keys
C-x 4 21.6 Prefix Keys
C-x 5 21.6 Prefix Keys
C-x 6 21.6 Prefix Keys
C-x RET 21.6 Prefix Keys
C-x v 21.6 Prefix Keys
C-x X = 17.2.13 Coverage Testing
caar 5.3 Accessing Elements of Lists
cadr 5.3 Accessing Elements of Lists
calendrical computations 38.9 Time Calculations
calendrical information 38.6 Time Conversion
call stack 17.1.8 Internals of the Debugger
call-interactively 20.3 Interactive Call
call-process 36.3 Creating a Synchronous Process
call-process, command-line arguments from minibuffer 36.2 Shell Arguments
call-process-region 36.3 Creating a Synchronous Process
call-process-shell-command 36.3 Creating a Synchronous Process
called-interactively-p 20.4 Distinguish Interactive Calls
calling a function 12.5 Calling Functions
cancel-change-group 31.27 Atomic Change Groups
cancel-debug-on-entry 17.1.3 Entering the Debugger on a Function Call
cancel-timer 38.10 Timers for Delayed Execution
capitalization 4.8 Case Conversion in Lisp
capitalize 4.8 Case Conversion in Lisp
capitalize-region 31.18 Case Changes
capitalize-word 31.18 Case Changes
car 5.3 Accessing Elements of Lists
car-safe 5.3 Accessing Elements of Lists
case conversion in buffers 31.18 Case Changes
case conversion in Lisp 4.8 Case Conversion in Lisp
case in replacements 33.6.1 Replacing the Text that Matched
case-fold-search 33.2 Searching and Case
case-replace 33.2 Searching and Case
case-table-p 4.9 The Case Table
catch 10.5.1 Explicit Nonlocal Exits: catch and throw
categories of characters 34.8 Categories
category (overlay property) 37.9.2 Overlay Properties
category (text property) 31.19.4 Properties with Special Meanings
category set 34.8 Categories
category table 34.8 Categories
category, regexp search for 33.3.1.3 Backslash Constructs in Regular Expressions
category-docstring 34.8 Categories
category-set-mnemonics 34.8 Categories
category-table 34.8 Categories
category-table-p 34.8 Categories
cdar 5.3 Accessing Elements of Lists
cddr 5.3 Accessing Elements of Lists
cdr 5.3 Accessing Elements of Lists
cdr-safe 5.3 Accessing Elements of Lists
ceiling 3.5 Numeric Conversions
centering point 27.20 Textual Scrolling
change hooks 31.28 Change Hooks
change hooks for a character 31.19.4 Properties with Special Meanings
change load-path at configure time E.1 Building Emacs
change-major-mode-after-body-hook 22.2.6 Mode Hooks
change-major-mode-hook 11.10.2 Creating and Deleting Buffer-Local Bindings
changing key bindings 21.12 Changing Key Bindings
changing text properties 31.19.2 Changing Text Properties
changing to another buffer 26.2 The Current Buffer
changing window size 27.4 Resizing Windows
char-after 31.1 Examining Text Near Point
char-before 31.1 Examining Text Near Point
char-category-set 34.8 Categories
char-charset 32.7 Character Sets
char-code-property-description 32.6 Character Properties
char-displayable-p 37.12.11 Fontsets
char-equal 4.5 Comparison of Characters and Strings
char-or-string-p 4.2 Predicates for Strings
char-property-alias-alist 31.19.1 Examining Text Properties
char-script-table 32.6 Character Properties
char-syntax 34.3 Syntax Table Functions
char-table length 6.1 Sequences
char-table-extra-slot 6.6 Char-Tables
char-table-p 6.6 Char-Tables
char-table-parent 6.6 Char-Tables
char-table-range 6.6 Char-Tables
char-table-subtype 6.6 Char-Tables
char-tables 6.6 Char-Tables
char-to-string 4.6 Conversion of Characters and Strings
char-width 37.10 Size of Displayed Text
char-width-table 32.6 Character Properties
character alternative (in regexp) 33.3.1.1 Special Characters in Regular Expressions
character arrays 4 Strings and Characters
character case 4.8 Case Conversion in Lisp
character categories 34.8 Categories
character classes in regexp 33.3.1.2 Character Classes
character code conversion 32.10.1 Basic Concepts of Coding Systems
character codepoint 32.1 Text Representations
character codes 32.5 Character Codes
character insertion 31.5 User-Level Insertion Commands
character printing 23.4 Describing Characters for Help Messages
character properties 32.6 Character Properties
character set, searching 32.8 Scanning for Character Sets
character sets 32.7 Character Sets
character to string 4.6 Conversion of Characters and Strings
character translation tables 32.9 Translation of Characters
character width on display 37.10 Size of Displayed Text
characterp 32.5 Character Codes
characters 4 Strings and Characters
characters for interactive codes 20.2.2 Code Characters for interactive
characters, multi-byte 32 Non-ASCII Characters
characters, representation in buffers and strings 32.1 Text Representations
charset 32.7 Character Sets
charset, coding systems to encode 32.10.3 Coding Systems in Lisp
charset, text property 32.10.7 Explicit Encoding and Decoding
charset-after 32.8 Scanning for Character Sets
charset-list 32.7 Character Sets
charset-plist 32.7 Character Sets
charset-priority-list 32.7 Character Sets
charsetp 32.7 Character Sets
charsets supported by a coding system 32.10.3 Coding Systems in Lisp
check-coding-system 32.10.3 Coding Systems in Lisp
check-coding-systems-region 32.10.3 Coding Systems in Lisp
checkdoc-minor-mode D.6 Tips for Documentation Strings
child process 36 Processes
child window 27.2 Windows and Frames
circular list 5.1 Lists and Cons Cells
circular structure, read syntax 2.5 Read Syntax for Circular Objects
cl 1.2 Lisp History
CL note—allocate more storage E.3 Garbage Collection
CL note—case of letters 2.3.4 Symbol Type
CL note—default optional arg 12.2.3 Other Features of Argument Lists
CL note—integers vrs eq 3.4 Comparison of Numbers
CL note—interning existing symbol 8.3 Creating and Interning Symbols
CL note—lack union, intersection 5.7 Using Lists as Sets
CL note—no continuable errors 10.5.3.1 How to Signal an Error
CL note—no setf functions 11.15.2 Defining new setf forms
CL note—only throw in Emacs 10.5.1 Explicit Nonlocal Exits: catch and throw
CL note—rplaca vs setcar 5.6 Modifying Existing List Structure
CL note—special forms compared 9.2.7 Special Forms
CL note—symbol in obarrays 8.3 Creating and Interning Symbols
classification of file types 24.6.2 Distinguishing Kinds of Files
classifying events 20.7.12 Classifying Events
cleanup forms 10.5.4 Cleaning Up from Nonlocal Exits
clear-abbrev-table 35.1 Abbrev Tables
clear-image-cache 37.17.11 Image Cache
clear-string 4.4 Modifying Strings
clear-this-command-keys 20.5 Information from the Command Loop
clear-visited-file-modtime 26.6 Buffer Modification Time
click event 20.7.4 Click Events
clickable buttons in buffers 37.18 Buttons
clickable text 31.19.8 Defining Clickable Text
clipboard 28.18 Window System Selections
clipboard support (for MS-Windows) 28.18 Window System Selections
clone-indirect-buffer 26.11 Indirect Buffers
closure 12.9 Closures
closures, example of using 11.9.3 Lexical Binding
clrhash 7.2 Hash Table Access
coded character set 32.7 Character Sets
codepoint, largest value 32.5 Character Codes
codes, interactive, description of 20.2.2 Code Characters for interactive
codespace 32.1 Text Representations
coding conventions in Emacs Lisp D.1 Emacs Lisp Coding Conventions
coding standards Appendix D Tips and Conventions
coding system 32.10 Coding Systems
coding system for operation 32.10.6 Specifying a Coding System for One Operation
coding system, automatically determined 32.10.5 Default Coding Systems
coding system, validity check 32.10.3 Coding Systems in Lisp
coding systems for encoding a string 32.10.3 Coding Systems in Lisp
coding systems for encoding region 32.10.3 Coding Systems in Lisp
coding systems, priority 32.10.6 Specifying a Coding System for One Operation
coding-system-aliases 32.10.1 Basic Concepts of Coding Systems
coding-system-change-eol-conversion 32.10.3 Coding Systems in Lisp
coding-system-change-text-conversion 32.10.3 Coding Systems in Lisp
coding-system-charset-list 32.10.3 Coding Systems in Lisp
coding-system-eol-type 32.10.3 Coding Systems in Lisp
coding-system-for-read 32.10.6 Specifying a Coding System for One Operation
coding-system-for-write 32.10.6 Specifying a Coding System for One Operation
coding-system-get 32.10.1 Basic Concepts of Coding Systems
coding-system-list 32.10.3 Coding Systems in Lisp
coding-system-p 32.10.3 Coding Systems in Lisp
coding-system-priority-list 32.10.6 Specifying a Coding System for One Operation
collapse-delayed-warnings 37.5.4 Delayed Warnings
color names 28.20 Color Names
color-defined-p 28.20 Color Names
color-gray-p 28.20 Color Names
color-supported-p 28.20 Color Names
color-values 28.20 Color Names
colors on text terminals 28.21 Text Terminal Colors
columns 31.16 Counting Columns
COM1 36.19 Communicating with Serial Ports
combine-after-change-calls 31.28 Change Hooks
combine-and-quote-strings 36.2 Shell Arguments
combining conditions 10.3 Constructs for Combining Conditions
command 12.1 What Is a Function?
command descriptions 1.3.7.1 A Sample Function Description
command history 20.15 Command History
command in keymap 21.10 Key Lookup
command loop 20 Command Loop
command loop variables 20.5 Information from the Command Loop
command loop, recursive 20.13 Recursive Editing
command-debug-status 17.1.8 Internals of the Debugger
command-error-function 10.5.3.2 How Emacs Processes Errors
command-execute 20.3 Interactive Call
command-history 20.15 Command History
command-line 38.1.4 Command-Line Arguments
command-line arguments 38.1.4 Command-Line Arguments
command-line options 38.1.4 Command-Line Arguments
command-line-args 38.1.4 Command-Line Arguments
command-line-args-left 38.1.4 Command-Line Arguments
command-line-functions 38.1.4 Command-Line Arguments
command-line-processed 38.1.4 Command-Line Arguments
command-remapping 21.13 Remapping Commands
command-switch-alist 38.1.4 Command-Line Arguments
commandp 20.3 Interactive Call
commandp example 19.6.4 High-Level Completion Functions
commands, defining 20.2 Defining Commands
comment style 34.2.2 Syntax Flags
comment syntax 34.2.1 Table of Syntax Classes
commentary, in a Lisp library D.8 Conventional Headers for Emacs Libraries
comments 2.2 Comments
comments, Lisp convention for D.7 Tips on Writing Comments
Common Lisp 1.2 Lisp History
compare-buffer-substrings 31.3 Comparing Text
compare-strings 4.5 Comparison of Characters and Strings
compare-window-configurations 27.24 Window Configurations
comparing buffer text 31.3 Comparing Text
comparing file modification time 26.6 Buffer Modification Time
comparing numbers 3.4 Comparison of Numbers
comparing time values 38.9 Time Calculations
compilation (Emacs Lisp) 16 Byte Compilation
compilation functions 16.2 Byte-Compilation Functions
compile-defun 16.2 Byte-Compilation Functions
compile-time constant 16.5 Evaluation During Compilation
compiled function 16.7 Byte-Code Function Objects
compiler errors 16.6 Compiler Errors
complete key 21.2 Keymap Basics
completing-read 19.6.2 Completion and the Minibuffer
completing-read-function 19.6.2 Completion and the Minibuffer
completion 19.6 Completion
completion styles 19.6.6 Completion Variables
completion table 19.6.1 Basic Completion Functions
completion table, modifying 19.6.1 Basic Completion Functions
completion tables, combining 19.6.1 Basic Completion Functions
completion, file name 24.8.6 File Name Completion
completion-at-point 19.6.8 Completion in Ordinary Buffers
completion-at-point-functions 19.6.8 Completion in Ordinary Buffers
completion-auto-help 19.6.3 Minibuffer Commands that Do Completion
completion-boundaries 19.6.1 Basic Completion Functions
completion-category-overrides 19.6.6 Completion Variables
completion-extra-properties 19.6.6 Completion Variables
completion-ignore-case 19.6.1 Basic Completion Functions
completion-ignored-extensions 24.8.6 File Name Completion
completion-in-region 19.6.8 Completion in Ordinary Buffers
completion-regexp-list 19.6.1 Basic Completion Functions
completion-styles 19.6.6 Completion Variables
completion-styles-alist 19.6.6 Completion Variables
completion-table-case-fold 19.6.1 Basic Completion Functions
completion-table-dynamic 19.6.7 Programmed Completion
completion-table-in-turn 19.6.1 Basic Completion Functions
completion-table-merge 19.6.1 Basic Completion Functions
completion-table-subvert 19.6.1 Basic Completion Functions
completion-table-with-cache 19.6.7 Programmed Completion
completion-table-with-predicate 19.6.1 Basic Completion Functions
completion-table-with-quoting 19.6.1 Basic Completion Functions
completion-table-with-terminator 19.6.1 Basic Completion Functions
complex arguments 19 Minibuffers
complex command 20.15 Command History
composite types (customization) 14.4.2 Composite Types
composition (text property) 31.19.4 Properties with Special Meanings
composition property, and point display 20.6 Adjusting Point After Commands
compute-motion 29.2.5 Motion by Screen Lines
concat 4.3 Creating Strings
concatenating bidirectional strings 37.24 Bidirectional Display
concatenating lists 5.6.3 Functions that Rearrange Lists
concatenating strings 4.3 Creating Strings
cond 10.2 Conditionals
condition name 10.5.3.4 Error Symbols and Condition Names
condition-case 10.5.3.3 Writing Code to Handle Errors
condition-case-unless-debug 10.5.3.3 Writing Code to Handle Errors
conditional evaluation 10.2 Conditionals
conditional selection of windows 27.9 Cyclic Ordering of Windows
cons 5.4 Building Cons Cells and Lists
cons cells 5.4 Building Cons Cells and Lists
cons-cells-consed E.4 Memory Usage
consing 5.4 Building Cons Cells and Lists
consp 5.2 Predicates on Lists
constant variables 11.2 Variables that Never Change
constant variables 11.5 Defining Global Variables
constrain-to-field 31.19.9 Defining and Using Fields
content directory, package 39.1 Packaging Basics
continuation lines 37.3 Truncation
continue-process 36.8 Sending Signals to Processes
control character key constants 21.12 Changing Key Bindings
control character printing 23.4 Describing Characters for Help Messages
control characters 2.3.3.3 Control-Character Syntax
control characters in display 37.21.1 Usual Display Conventions
control characters, reading 20.8.5 Quoted Character Input
control structures 10 Control Structures
Control-X-prefix 21.6 Prefix Keys
controller part, model/view/controller 37.19.2 Abstract Display Example
controlling terminal 38.2.2 Suspending Emacs
controlling-tty-p 38.2.2 Suspending Emacs
conventions for writing major modes 22.2.1 Major Mode Conventions
conventions for writing minor modes 22.3.1 Conventions for Writing Minor Modes
conversion of strings 4.6 Conversion of Characters and Strings
convert-standard-filename 24.8.7 Standard File Names
converting file names from/to MS-Windows syntax 24.8 File Names
converting numbers 3.5 Numeric Conversions
coordinate, relative to frame 27.23 Coordinates and Windows
coordinates-in-window-p 27.23 Coordinates and Windows
copy-abbrev-table 35.1 Abbrev Tables
copy-alist 5.8 Association Lists
copy-category-table 34.8 Categories
copy-directory 24.10 Creating, Copying and Deleting Directories
copy-file 24.7 Changing File Names and Attributes
copy-hash-table 7.4 Other Hash Table Functions
copy-keymap 21.4 Creating Keymaps
copy-marker 30.3 Functions that Create Markers
copy-overlay 37.9.1 Managing Overlays
copy-region-as-kill 31.8.2 Functions for Killing
copy-sequence 6.1 Sequences
copy-syntax-table 34.3 Syntax Table Functions
copy-tree 5.4 Building Cons Cells and Lists
copying alists 5.8 Association Lists
copying files 24.7 Changing File Names and Attributes
copying lists 5.4 Building Cons Cells and Lists
copying sequences 6.1 Sequences
copying strings 4.3 Creating Strings
copying vectors 6.5 Functions for Vectors
copysign 3.2 Floating-Point Basics
cos 3.9 Standard Mathematical Functions
count-lines 29.2.4 Motion by Text Lines
count-loop 1.3.7.1 A Sample Function Description
count-screen-lines 29.2.5 Motion by Screen Lines
count-words 29.2.4 Motion by Text Lines
counting columns 31.16 Counting Columns
coverage testing 17.4 Test Coverage
coverage testing (Edebug) 17.2.13 Coverage Testing
create subprocess 36.1 Functions that Create Subprocesses
create-file-buffer 24.1.2 Subroutines of Visiting
create-fontset-from-fontset-spec 37.12.11 Fontsets
create-image 37.17.8 Defining Images
create-lockfiles 24.5 File Locks
creating buffers 26.9 Creating Buffers
creating hash tables 7.1 Creating Hash Tables
creating keymaps 21.4 Creating Keymaps
creating markers 30.3 Functions that Create Markers
creating strings 4.3 Creating Strings
creating, copying and deleting directories 24.10 Creating, Copying and Deleting Directories
cryptographic hash 31.25 Checksum/Hash
ctl-arrow 37.21.1 Usual Display Conventions
ctl-x-4-map 21.6 Prefix Keys
ctl-x-5-map 21.6 Prefix Keys
ctl-x-map 21.6 Prefix Keys
ctl-x-r-map Appendix G Standard Keymaps
current binding 11.3 Local Variables
current buffer 26.2 The Current Buffer
current buffer mark 30.7 The Mark
current buffer point and mark (Edebug) 17.2.14.2 Edebug Display Update
current buffer position 29.1 Point
current command 20.5 Information from the Command Loop
current stack frame 17.1.5 Using the Debugger
current-active-maps 21.7 Active Keymaps
current-bidi-paragraph-direction 37.24 Bidirectional Display
current-buffer 26.2 The Current Buffer
current-case-table 4.9 The Case Table
current-column 31.16 Counting Columns
current-fill-column 31.12 Margins for Filling
current-frame-configuration 28.12 Frame Configurations
current-global-map 21.9 Controlling the Active Keymaps
current-idle-time 38.11 Idle Timers
current-indentation 31.17.1 Indentation Primitives
current-input-method 32.11 Input Methods
current-input-mode 38.12.1 Input Modes
current-justification 31.11 Filling
current-kill 31.8.5 Low-Level Kill Ring
current-left-margin 31.12 Margins for Filling
current-local-map 21.9 Controlling the Active Keymaps
current-message 37.4.1 Displaying Messages in the Echo Area
current-minor-mode-maps 21.9 Controlling the Active Keymaps
current-prefix-arg 20.12 Prefix Command Arguments
current-time 38.5 Time of Day
current-time-string 38.5 Time of Day
current-time-zone 38.5 Time of Day
current-window-configuration 27.24 Window Configurations
current-word 31.2 Examining Buffer Contents
currying 12.5 Calling Functions
cursor 27.18 Windows and Point
cursor (text property) 31.19.4 Properties with Special Meanings
cursor position for display properties and overlays 31.19.4 Properties with Special Meanings
cursor, and frame parameters 28.3.3.7 Cursor Parameters
cursor, fringe 37.13.3 Fringe Cursors
cursor-color, a frame parameter 28.3.3.8 Font and Color Parameters
cursor-in-echo-area 37.4.4 Echo Area Customization
cursor-in-non-selected-windows 28.3.3.7 Cursor Parameters
cursor-type 28.3.3.7 Cursor Parameters
cursor-type 28.3.3.7 Cursor Parameters
cursor-type, a frame parameter 28.3.3.7 Cursor Parameters
cust-print 17.2.11 Printing in Edebug
custom themes 14.6 Custom Themes
custom-add-frequent-value 14.3 Defining Customization Variables
custom-initialize-delay E.1 Building Emacs
custom-known-themes 14.6 Custom Themes
custom-reevaluate-setting 14.3 Defining Customization Variables
custom-set-faces 14.5 Applying Customizations
custom-set-variables 14.5 Applying Customizations
custom-theme-p 14.6 Custom Themes
custom-theme-set-faces 14.6 Custom Themes
custom-theme-set-variables 14.6 Custom Themes
custom-unlispify-remove-prefixes 14.2 Defining Customization Groups
custom-variable-p 14.3 Defining Customization Variables
customizable variables, how to define 14.3 Defining Customization Variables
customization groups, defining 14.2 Defining Customization Groups
customization item 14 Customization Settings
customization keywords 14.1 Common Item Keywords
customization types 14.4 Customization Types
customization types, define new 14.4.5 Defining New Types
customize-package-emacs-version-alist 14.1 Common Item Keywords
cyclic ordering of windows 27.9 Cyclic Ordering of Windows
cygwin-convert-file-name-from-windows 24.8 File Names
cygwin-convert-file-name-to-windows 24.8 File Names

D
data type 2 Lisp Data Types
data-directory 23.5 Help Functions
datagrams 36.16 Datagrams
date-leap-year-p 38.9 Time Calculations
date-to-time 38.7 Parsing and Formatting Times
deactivate-mark 30.7 The Mark
deactivate-mark 30.7 The Mark
deactivate-mark-hook 30.7 The Mark
debug 17.1.7 Invoking the Debugger
debug-ignored-errors 17.1.1 Entering the Debugger on an Error
debug-on-entry 17.1.3 Entering the Debugger on a Function Call
debug-on-error 17.1.1 Entering the Debugger on an Error
debug-on-error use 10.5.3.2 How Emacs Processes Errors
debug-on-event 17.1.1 Entering the Debugger on an Error
debug-on-message 17.1.1 Entering the Debugger on an Error
debug-on-next-call 17.1.8 Internals of the Debugger
debug-on-quit 17.1.2 Debugging Infinite Loops
debug-on-signal 17.1.1 Entering the Debugger on an Error
debugger 17.1.8 Internals of the Debugger
debugger command list 17.1.6 Debugger Commands
debugger for Emacs Lisp 17.1 The Lisp Debugger
debugger, explicit entry 17.1.4 Explicit Entry to the Debugger
debugger-bury-or-kill 17.1.5 Using the Debugger
debugging errors 17.1.1 Entering the Debugger on an Error
debugging invalid Lisp syntax 17.3 Debugging Invalid Lisp Syntax
debugging lisp programs 17 Debugging Lisp Programs
debugging specific functions 17.1.3 Entering the Debugger on a Function Call
declare 12.13 The declare Form
declare 12.13 The declare Form
declare-function 12.14 Telling the Compiler that a Function is Defined
declare-function 12.14 Telling the Compiler that a Function is Defined
declaring functions 12.14 Telling the Compiler that a Function is Defined
decode process output 36.9.3 Decoding Process Output
decode-char 32.7 Character Sets
decode-coding-inserted-region 32.10.7 Explicit Encoding and Decoding
decode-coding-region 32.10.7 Explicit Encoding and Decoding
decode-coding-string 32.10.7 Explicit Encoding and Decoding
decode-time 38.6 Time Conversion
decoding file formats 24.12 File Format Conversion
decoding in coding systems 32.10.7 Explicit Encoding and Decoding
decrement field of register 2.3.6 Cons Cell and List Types
dedicated window 27.16 Dedicated Windows
def-edebug-spec 17.2.15.1 Instrumenting Macro Calls
defalias 12.4 Defining Functions
defalias-fset-function property 12.4 Defining Functions
default argument string 20.2.2 Code Characters for interactive
default coding system 32.10.5 Default Coding Systems
default coding system, functions to determine 32.10.5 Default Coding Systems
default init file 38.1.2 The Init File
default key binding 21.3 Format of Keymaps
default value 11.10.3 The Default Value of a Buffer-Local Variable
default value of char-table 6.6 Char-Tables
default-boundp 11.10.3 The Default Value of a Buffer-Local Variable
default-directory 24.8.4 Functions that Expand Filenames
default-file-modes 24.7 Changing File Names and Attributes
default-frame-alist 28.3.2 Initial Frame Parameters
default-input-method 32.11 Input Methods
default-justification 31.11 Filling
default-minibuffer-frame 28.8 Minibuffers and Frames
default-process-coding-system 32.10.5 Default Coding Systems
default-text-properties 31.19.1 Examining Text Properties
default-value 11.10.3 The Default Value of a Buffer-Local Variable
default.el 38.1.1 Summary: Sequence of Actions at Startup
defconst 11.5 Defining Global Variables
defcustom 14.3 Defining Customization Variables
defface 37.12.2 Defining Faces
defgroup 14.2 Defining Customization Groups
defimage 37.17.8 Defining Images
define customization group 14.2 Defining Customization Groups
define customization options 14.3 Defining Customization Variables
define hash comparisons 7.3 Defining Hash Comparisons
define image 37.17.8 Defining Images
define new customization types 14.4.5 Defining New Types
define-abbrev 35.2 Defining Abbrevs
define-abbrev-table 35.1 Abbrev Tables
define-alternatives 20.2.4 Select among Command Alternatives
define-button-type 37.18.2 Button Types
define-category 34.8 Categories
define-derived-mode 22.2.4 Defining Derived Modes
define-error 10.5.3.4 Error Symbols and Condition Names
define-error 10.5.3.4 Error Symbols and Condition Names
define-fringe-bitmap 37.13.5 Customizing Fringe Bitmaps
define-generic-mode 22.2.8 Generic Modes
define-globalized-minor-mode 22.3.3 Defining Minor Modes
define-hash-table-test 7.3 Defining Hash Comparisons
define-key 21.12 Changing Key Bindings
define-key-after 21.17.7 Modifying Menus
define-minor-mode 22.3.3 Defining Minor Modes
define-obsolete-face-alias 37.12.6 Functions for Working with Faces
define-obsolete-function-alias 12.11 Declaring Functions Obsolete
define-obsolete-variable-alias 11.13 Variable Aliases
define-package 39.3 Multi-file Packages
define-prefix-command 21.6 Prefix Keys
defined-colors 28.20 Color Names
defining a function 12.4 Defining Functions
defining abbrevs 35.2 Defining Abbrevs
defining commands 20.2 Defining Commands
defining customization variables in C E.6 Writing Emacs Primitives
defining faces 37.12.2 Defining Faces
defining Lisp variables in C E.6 Writing Emacs Primitives
defining macros 13.4 Defining Macros
defining menus 21.17.1 Defining Menus
defining tokens, SMIE 22.7.1.4 Defining Tokens
defining-kbd-macro 20.16 Keyboard Macros
definitions of symbols 8.2 Defining Symbols
defmacro 13.4 Defining Macros
defsubr, Lisp symbol for a primitive E.6 Writing Emacs Primitives
defsubst 12.12 Inline Functions
deftheme 14.6 Custom Themes
defun 12.4 Defining Functions
DEFUN, C macro to define Lisp primitives E.6 Writing Emacs Primitives
defun-prompt-regexp 29.2.6 Moving over Balanced Expressions
defvar 11.5 Defining Global Variables
defvar-local 11.10.2 Creating and Deleting Buffer-Local Bindings
defvaralias 11.13 Variable Aliases
DEFVAR_INT, DEFVAR_LISP, DEFVAR_BOOL E.6 Writing Emacs Primitives
delay-mode-hooks 22.2.6 Mode Hooks
delayed warnings 37.5.4 Delayed Warnings
delayed-warnings-hook 37.5.4 Delayed Warnings
delayed-warnings-hook Appendix H Standard Hooks
delayed-warnings-list 37.5.4 Delayed Warnings
delete 5.7 Using Lists as Sets
delete-and-extract-region 31.6 Deleting Text
delete-auto-save-file-if-necessary 25.2 Auto-Saving
delete-auto-save-files 25.2 Auto-Saving
delete-backward-char 31.6 Deleting Text
delete-blank-lines 31.7 User-Level Deletion Commands
delete-by-moving-to-trash 24.7 Changing File Names and Attributes
delete-by-moving-to-trash 24.10 Creating, Copying and Deleting Directories
delete-char 31.6 Deleting Text
delete-directory 24.10 Creating, Copying and Deleting Directories
delete-dups 5.7 Using Lists as Sets
delete-exited-processes 36.5 Deleting Processes
delete-field 31.19.9 Defining and Using Fields
delete-file 24.7 Changing File Names and Attributes
delete-frame 28.6 Deleting Frames
delete-frame event 20.7.10 Miscellaneous System Events
delete-frame-functions 28.6 Deleting Frames
delete-horizontal-space 31.7 User-Level Deletion Commands
delete-indentation 31.7 User-Level Deletion Commands
delete-minibuffer-contents 19.12 Minibuffer Contents
delete-old-versions 25.1.3 Making and Deleting Numbered Backup Files
delete-other-windows 27.6 Deleting Windows
delete-overlay 37.9.1 Managing Overlays
delete-process 36.5 Deleting Processes
delete-region 31.6 Deleting Text
delete-terminal 28.2 Multiple Terminals
delete-terminal-functions 28.2 Multiple Terminals
delete-to-left-margin 31.12 Margins for Filling
delete-trailing-whitespace 31.7 User-Level Deletion Commands
delete-window 27.6 Deleting Windows
delete-windows-on 27.6 Deleting Windows
deleting files 24.7 Changing File Names and Attributes
deleting frames 28.6 Deleting Frames
deleting list elements 5.7 Using Lists as Sets
deleting previous char 31.6 Deleting Text
deleting processes 36.5 Deleting Processes
deleting text vs killing 31.6 Deleting Text
deleting whitespace 31.7 User-Level Deletion Commands
deleting windows 27.6 Deleting Windows
delq 5.7 Using Lists as Sets
dependencies 39.1 Packaging Basics
derived mode 22.2.4 Defining Derived Modes
derived-mode-p 22.2.4 Defining Derived Modes
describe characters and events 23.4 Describing Characters for Help Messages
describe-bindings 21.16 Scanning Keymaps
describe-buffer-case-table 4.9 The Case Table
describe-categories 34.8 Categories
describe-current-display-table 37.21.2 Display Tables
describe-display-table 37.21.2 Display Tables
describe-mode 22.2.3 Getting Help about a Major Mode
describe-prefix-bindings 23.5 Help Functions
describe-syntax 34.3 Syntax Table Functions
description for interactive codes 20.2.2 Code Characters for interactive
description format 1.3.7 Format of Descriptions
deserializing 36.20 Packing and Unpacking Byte Arrays
desktop notifications 38.18 Desktop Notifications
desktop save mode 22.8 Desktop Save Mode
desktop-buffer-mode-handlers 22.8 Desktop Save Mode
desktop-save-buffer 22.8 Desktop Save Mode
destroy-fringe-bitmap 37.13.5 Customizing Fringe Bitmaps
destructive list operations 5.6 Modifying Existing List Structure
detect-coding-region 32.10.3 Coding Systems in Lisp
detect-coding-string 32.10.3 Coding Systems in Lisp
diagrams, boxed, for lists 2.3.6.1 Drawing Lists as Box Diagrams
dialog boxes 28.16 Dialog Boxes
digit-argument 20.12 Prefix Command Arguments
ding 37.22 Beeping
dir-locals-class-alist 11.12 Directory Local Variables
dir-locals-directory-cache 11.12 Directory Local Variables
dir-locals-file 11.12 Directory Local Variables
dir-locals-set-class-variables 11.12 Directory Local Variables
dir-locals-set-directory-class 11.12 Directory Local Variables
directory local variables 11.12 Directory Local Variables
directory name 24.8.3 Directory Names
directory part (of file name) 24.8.1 File Name Components
directory-file-name 24.8.3 Directory Names
directory-files 24.9 Contents of Directories
directory-files-and-attributes 24.9 Contents of Directories
directory-oriented functions 24.9 Contents of Directories
dired-kept-versions 25.1.3 Making and Deleting Numbered Backup Files
disable-command 20.14 Disabling Commands
disable-point-adjustment 20.6 Adjusting Point After Commands
disable-theme 14.6 Custom Themes
disabled 20.14 Disabling Commands
disabled command 20.14 Disabling Commands
disabled-command-function 20.14 Disabling Commands
disabling multibyte 32.2 Disabling Multibyte Characters
disabling undo 31.10 Maintaining Undo Lists
disassemble 16.8 Disassembled Byte-Code
disassembled byte-code 16.8 Disassembled Byte-Code
discard-input 20.8.6 Miscellaneous Event Input Features
discarding input 20.8.6 Miscellaneous Event Input Features
display (overlay property) 37.9.2 Overlay Properties
display (text property) 37.16 The display Property
display action 27.12 Choosing a Window for Display
display feature testing 28.23 Display Feature Testing
display margins 37.16.5 Displaying in the Margins
display message in echo area 37.4.1 Displaying Messages in the Echo Area
display name on X 28.2 Multiple Terminals
display properties, and bidi reordering of text 37.24 Bidirectional Display
display property, and point display 20.6 Adjusting Point After Commands
display specification 37.16 The display Property
display table 37.21.2 Display Tables
display, a frame parameter 28.3.3.1 Basic Parameters
display, abstract 37.19 Abstract Display
display, arbitrary objects 37.19 Abstract Display
display-backing-store 28.23 Display Feature Testing
display-buffer 27.12 Choosing a Window for Display
display-buffer-alist 27.12 Choosing a Window for Display
display-buffer-at-bottom 27.13 Action Functions for display-buffer
display-buffer-base-action 27.12 Choosing a Window for Display
display-buffer-below-selected 27.13 Action Functions for display-buffer
display-buffer-fallback-action 27.12 Choosing a Window for Display
display-buffer-in-previous-window 27.13 Action Functions for display-buffer
display-buffer-no-window 27.13 Action Functions for display-buffer
display-buffer-overriding-action 27.12 Choosing a Window for Display
display-buffer-pop-up-frame 27.13 Action Functions for display-buffer
display-buffer-pop-up-window 27.13 Action Functions for display-buffer
display-buffer-reuse-window 27.13 Action Functions for display-buffer
display-buffer-same-window 27.13 Action Functions for display-buffer
display-buffer-use-some-window 27.13 Action Functions for display-buffer
display-color-cells 28.23 Display Feature Testing
display-color-p 28.23 Display Feature Testing
display-completion-list 19.6.3 Minibuffer Commands that Do Completion
display-delayed-warnings 37.5.4 Delayed Warnings
display-graphic-p 28.23 Display Feature Testing
display-grayscale-p 28.23 Display Feature Testing
display-images-p 28.23 Display Feature Testing
display-message-or-buffer 37.4.1 Displaying Messages in the Echo Area
display-mm-dimensions-alist 28.23 Display Feature Testing
display-mm-height 28.23 Display Feature Testing
display-mm-width 28.23 Display Feature Testing
display-monitor-attributes-list 28.2 Multiple Terminals
display-mouse-p 28.23 Display Feature Testing
display-pixel-height 28.23 Display Feature Testing
display-pixel-width 28.23 Display Feature Testing
display-planes 28.23 Display Feature Testing
display-popup-menus-p 28.23 Display Feature Testing
display-save-under 28.23 Display Feature Testing
display-screens 28.23 Display Feature Testing
display-selections-p 28.23 Display Feature Testing
display-start position 27.19 The Window Start and End Positions
display-supports-face-attributes-p 28.23 Display Feature Testing
display-table-slot 37.21.2 Display Tables
display-type, a frame parameter 28.3.3.1 Basic Parameters
display-visual-class 28.23 Display Feature Testing
display-warning 37.5.1 Warning Basics
displaying a buffer 27.11 Switching to a Buffer in a Window
displaying faces 37.12.4 Displaying Faces
displays, multiple 28.2 Multiple Terminals
distinguish interactive calls 20.4 Distinguish Interactive Calls
dnd-protocol-alist 28.19 Drag and Drop
do-auto-save 25.2 Auto-Saving
DOC (documentation) file 23.1 Documentation Basics
doc, customization keyword 14.4.4 Type Keywords
doc-directory 23.2 Access to Documentation Strings
documentation 23.2 Access to Documentation Strings
documentation conventions 23.1 Documentation Basics
documentation for major mode 22.2.3 Getting Help about a Major Mode
documentation notation 1.3.3 Evaluation Notation
documentation of function 12.2.4 Documentation Strings of Functions
documentation strings 23 Documentation
documentation strings, conventions and tips D.6 Tips for Documentation Strings
documentation, keys in 23.3 Substituting Key Bindings in Documentation
documentation-property 23.2 Access to Documentation Strings
dolist 10.4 Iteration
dotimes 10.4 Iteration
dotimes-with-progress-reporter 37.4.2 Reporting Operation Progress
dotted list 5.1 Lists and Cons Cells
dotted lists (Edebug) 17.2.15.2 Specification List
dotted pair notation 2.3.6.2 Dotted Pair Notation
double-click events 20.7.7 Repeat Events
double-click-fuzz 20.7.7 Repeat Events
double-click-time 20.7.7 Repeat Events
double-quote in strings 2.3.8.1 Syntax for Strings
down-list 29.2.6 Moving over Balanced Expressions
downcase 4.8 Case Conversion in Lisp
downcase-region 31.18 Case Changes
downcase-word 31.18 Case Changes
downcasing in lookup-key 20.8.1 Key Sequence Input
drag and drop 28.19 Drag and Drop
drag event 20.7.5 Drag Events
drag-n-drop event 20.7.10 Miscellaneous System Events
dribble file 38.12.2 Recording Input
dump-emacs E.1 Building Emacs
dumping Emacs E.1 Building Emacs
dynamic binding 11.9 Scoping Rules for Variable Bindings
dynamic extent 11.9 Scoping Rules for Variable Bindings
dynamic libraries 38.20 Dynamically Loaded Libraries
dynamic loading of documentation 16.3 Documentation Strings and Compilation
dynamic loading of functions 16.4 Dynamic Loading of Individual Functions
dynamic scope 11.9 Scoping Rules for Variable Bindings
dynamic-library-alist 38.20 Dynamically Loaded Libraries

E
eager macro expansion 15.1 How Programs Do Loading
easy-menu-define 21.17.8 Easy Menu
easy-mmode-define-minor-mode 22.3.3 Defining Minor Modes
echo area 37.4 The Echo Area
echo area customization 37.4.4 Echo Area Customization
echo-area-clear-hook 37.4.4 Echo Area Customization
echo-keystrokes 37.4.4 Echo Area Customization
edebug 17.2.6.3 Source Breakpoints
Edebug debugging facility 17.2 Edebug
Edebug execution modes 17.2.3 Edebug Execution Modes
Edebug specification list 17.2.15.2 Specification List
edebug-all-defs 17.2.16 Edebug Options
edebug-all-forms 17.2.16 Edebug Options
edebug-continue-kbd-macro 17.2.16 Edebug Options
edebug-defun 17.2.2 Instrumenting for Edebug
edebug-display-freq-count 17.2.13 Coverage Testing
edebug-eval-macro-args 17.2.15.1 Instrumenting Macro Calls
edebug-eval-top-level-form 17.2.2 Instrumenting for Edebug
edebug-global-break-condition 17.2.16 Edebug Options
edebug-initial-mode 17.2.16 Edebug Options
edebug-on-error 17.2.16 Edebug Options
edebug-on-quit 17.2.16 Edebug Options
edebug-print-circle 17.2.11 Printing in Edebug
edebug-print-length 17.2.11 Printing in Edebug
edebug-print-level 17.2.11 Printing in Edebug
edebug-print-trace-after 17.2.12 Trace Buffer
edebug-print-trace-before 17.2.12 Trace Buffer
edebug-save-displayed-buffer-points 17.2.16 Edebug Options
edebug-save-windows 17.2.16 Edebug Options
edebug-set-global-break-condition 17.2.6.2 Global Break Condition
edebug-setup-hook 17.2.16 Edebug Options
edebug-sit-for-seconds 17.2.3 Edebug Execution Modes
edebug-temp-display-freq-count 17.2.13 Coverage Testing
edebug-test-coverage 17.2.16 Edebug Options
edebug-trace 17.2.16 Edebug Options
edebug-trace 17.2.12 Trace Buffer
edebug-tracing 17.2.12 Trace Buffer
edebug-unwrap-results 17.2.16 Edebug Options
edge detection, images 37.17.2 Image Descriptors
edit-and-eval-command 19.3 Reading Lisp Objects with the Minibuffer
editing types 2.4 Editing Types
editor command loop 20 Command Loop
eight-bit, a charset 32.7 Character Sets
electric-future-map 1.3.7.2 A Sample Variable Description
element (of list) 5 Lists
elements of sequences 6.1 Sequences
elp.el 17.5 Profiling
elt 6.1 Sequences
Emacs event standard notation 23.4 Describing Characters for Help Messages
Emacs process run time 38.8 Processor Run time
emacs, a charset 32.7 Character Sets
emacs-build-time 1.4 Version Information
emacs-init-time 38.8 Processor Run time
emacs-internal coding system 32.10.1 Basic Concepts of Coding Systems
emacs-lisp-docstring-fill-column D.6 Tips for Documentation Strings
emacs-major-version 1.4 Version Information
emacs-minor-version 1.4 Version Information
emacs-pid 38.3 Operating System Environment
emacs-save-session-functions 38.17 Session Management
emacs-session-restore 38.17 Session Management
emacs-startup-hook 38.1.2 The Init File
emacs-uptime 38.8 Processor Run time
emacs-version 1.4 Version Information
emacs-version 1.4 Version Information
EMACSLOADPATH environment variable 15.3 Library Search
empty lines, indicating 37.13.2 Fringe Indicators
empty list 2.3.6.1 Drawing Lists as Box Diagrams
empty region 30.8 The Region
emulation-mode-map-alists 21.9 Controlling the Active Keymaps
enable-command 20.14 Disabling Commands
enable-dir-local-variables 11.12 Directory Local Variables
enable-local-eval 11.11 File Local Variables
enable-local-variables 11.11 File Local Variables
enable-multibyte-characters 32.1 Text Representations
enable-multibyte-characters 32.2 Disabling Multibyte Characters
enable-recursive-minibuffers 19.13 Recursive Minibuffers
enable-theme 14.6 Custom Themes
encapsulation, ewoc 37.19 Abstract Display
encode-char 32.7 Character Sets
encode-coding-region 32.10.7 Explicit Encoding and Decoding
encode-coding-string 32.10.7 Explicit Encoding and Decoding
encode-time 38.6 Time Conversion
encoding file formats 24.12 File Format Conversion
encoding in coding systems 32.10.7 Explicit Encoding and Decoding
encrypted network connections 36.14 Network Connections
end of line in regexp 33.3.1.1 Special Characters in Regular Expressions
end-of-buffer 29.2.3 Motion to an End of the Buffer
end-of-defun 29.2.6 Moving over Balanced Expressions
end-of-defun-function 29.2.6 Moving over Balanced Expressions
end-of-file 18.3 Input Functions
end-of-line 29.2.4 Motion by Text Lines
end-of-line conversion 32.10.1 Basic Concepts of Coding Systems
endianness 36.20.1 Describing Data Layout
environment 9.1 Introduction to Evaluation
environment variable access 38.3 Operating System Environment
environment variables, subprocesses 36.1 Functions that Create Subprocesses
eobp 31.1 Examining Text Near Point
EOL conversion 32.10.1 Basic Concepts of Coding Systems
eol conversion of coding system 32.10.3 Coding Systems in Lisp
eol type of coding system 32.10.3 Coding Systems in Lisp
eolp 31.1 Examining Text Near Point
epoch 38.5 Time of Day
eq 2.7 Equality Predicates
eql 3.4 Comparison of Numbers
equal 2.7 Equality Predicates
equal-including-properties 2.7 Equality Predicates
equality 2.7 Equality Predicates
erase-buffer 31.6 Deleting Text
error 10.5.3.1 How to Signal an Error
error cleanup 10.5.4 Cleaning Up from Nonlocal Exits
error debugging 17.1.1 Entering the Debugger on an Error
error description 10.5.3.3 Writing Code to Handle Errors
error display 37.4 The Echo Area
error handler 10.5.3.3 Writing Code to Handle Errors
error in debug 17.1.7 Invoking the Debugger
error message notation 1.3.5 Error Messages
error name 10.5.3.4 Error Symbols and Condition Names
error symbol 10.5.3.4 Error Symbols and Condition Names
error-conditions 10.5.3.4 Error Symbols and Condition Names
error-message-string 10.5.3.3 Writing Code to Handle Errors
errors 10.5.3 Errors
ESC 21.11 Functions for Key Lookup
esc-map 21.6 Prefix Keys
ESC-prefix 21.6 Prefix Keys
escape (ASCII character) 2.3.3.1 Basic Char Syntax
escape characters 18.6 Variables Affecting Output
escape characters in printing 18.5 Output Functions
escape sequence 2.3.3.1 Basic Char Syntax
eval 9.5 Eval
eval during compilation 16.5 Evaluation During Compilation
eval, and debugging 17.1.8 Internals of the Debugger
eval-and-compile 16.5 Evaluation During Compilation
eval-buffer 9.5 Eval
eval-buffer (Edebug) 17.2.2 Instrumenting for Edebug
eval-current-buffer 9.5 Eval
eval-current-buffer (Edebug) 17.2.2 Instrumenting for Edebug
eval-defun (Edebug) 17.2.2 Instrumenting for Edebug
eval-expression (Edebug) 17.2.2 Instrumenting for Edebug
eval-expression-debug-on-error 17.1.1 Entering the Debugger on an Error
eval-expression-print-length 18.6 Variables Affecting Output
eval-expression-print-level 18.6 Variables Affecting Output
eval-minibuffer 19.3 Reading Lisp Objects with the Minibuffer
eval-region 9.5 Eval
eval-region (Edebug) 17.2.2 Instrumenting for Edebug
eval-when-compile 16.5 Evaluation During Compilation
evaluated expression argument 20.2.2 Code Characters for interactive
evaluation 9 Evaluation
evaluation error 11.3 Local Variables
evaluation list group 17.2.10 Evaluation List Buffer
evaluation notation 1.3.3 Evaluation Notation
evaluation of buffer contents 9.5 Eval
evaluation of special forms 9.2.7 Special Forms
evaporate (overlay property) 37.9.2 Overlay Properties
event printing 23.4 Describing Characters for Help Messages
event translation 20.8.3 Modifying and Translating Input Events
event type 20.7.12 Classifying Events
event, reading only one 20.8.2 Reading One Event
event-basic-type 20.7.12 Classifying Events
event-click-count 20.7.7 Repeat Events
event-convert-list 20.7.12 Classifying Events
event-end 20.7.13 Accessing Mouse Events
event-modifiers 20.7.12 Classifying Events
event-start 20.7.13 Accessing Mouse Events
eventp 20.7 Input Events
events 20.7 Input Events
ewoc 37.19 Abstract Display
ewoc-buffer 37.19.1 Abstract Display Functions
ewoc-collect 37.19.1 Abstract Display Functions
ewoc-create 37.19.1 Abstract Display Functions
ewoc-data 37.19.1 Abstract Display Functions
ewoc-delete 37.19.1 Abstract Display Functions
ewoc-enter-after 37.19.1 Abstract Display Functions
ewoc-enter-before 37.19.1 Abstract Display Functions
ewoc-enter-first 37.19.1 Abstract Display Functions
ewoc-enter-last 37.19.1 Abstract Display Functions
ewoc-filter 37.19.1 Abstract Display Functions
ewoc-get-hf 37.19.1 Abstract Display Functions
ewoc-goto-next 37.19.1 Abstract Display Functions
ewoc-goto-node 37.19.1 Abstract Display Functions
ewoc-goto-prev 37.19.1 Abstract Display Functions
ewoc-invalidate 37.19.1 Abstract Display Functions
ewoc-locate 37.19.1 Abstract Display Functions
ewoc-location 37.19.1 Abstract Display Functions
ewoc-map 37.19.1 Abstract Display Functions
ewoc-next 37.19.1 Abstract Display Functions
ewoc-nth 37.19.1 Abstract Display Functions
ewoc-prev 37.19.1 Abstract Display Functions
ewoc-refresh 37.19.1 Abstract Display Functions
ewoc-set-data 37.19.1 Abstract Display Functions
ewoc-set-hf 37.19.1 Abstract Display Functions
examining text properties 31.19.1 Examining Text Properties
examining the interactive form 20.2.1 Using interactive
examining windows 27.10 Buffers and Windows
examples of using interactive 20.2.3 Examples of Using interactive
excess close parentheses 17.3.2 Excess Close Parentheses
excess open parentheses 17.3.1 Excess Open Parentheses
excursion 29.3 Excursions
exec-directory 36.1 Functions that Create Subprocesses
exec-path 36.1 Functions that Create Subprocesses
exec-suffixes 36.1 Functions that Create Subprocesses
executable-find 24.6.6 Locating Files in Standard Places
execute program 36.1 Functions that Create Subprocesses
execute with prefix argument 20.3 Interactive Call
execute-extended-command 20.3 Interactive Call
execute-kbd-macro 20.16 Keyboard Macros
executing-kbd-macro 20.16 Keyboard Macros
execution speed D.4 Tips for Making Compiled Code Fast
exit 20.13 Recursive Editing
exit recursive editing 20.13 Recursive Editing
exit-minibuffer 19.10 Minibuffer Commands
exit-recursive-edit 20.13 Recursive Editing
exiting Emacs 38.2 Getting Out of Emacs
exp 3.9 Standard Mathematical Functions
expand-abbrev 35.4 Looking Up and Expanding Abbreviations
expand-file-name 24.8.4 Functions that Expand Filenames
expanding abbrevs 35.4 Looking Up and Expanding Abbreviations
expansion of file names 24.8.4 Functions that Expand Filenames
expansion of macros 13.2 Expansion of a Macro Call
explicit selective display 37.7 Selective Display
expression 9.1 Introduction to Evaluation
expt 3.9 Standard Mathematical Functions
extended file attributes 24.6.5 Extended File Attributes
extended menu item 21.17.1.2 Extended Menu Items
extended-command-history 19.4 Minibuffer History
extent 11.9 Scoping Rules for Variable Bindings
extra slots of char-table 6.6 Char-Tables
extra-keyboard-modifiers 20.8.3 Modifying and Translating Input Events

F
face (button property) 37.18.1 Button Properties
face (overlay property) 37.9.2 Overlay Properties
face (text property) 31.19.4 Properties with Special Meanings
face alias 37.12.6 Functions for Working with Faces
face attributes 37.12.1 Face Attributes
face attributes, access and modification 37.12.3 Face Attribute Functions
face codes of text 31.19.4 Properties with Special Meanings
face merging 37.12.4 Displaying Faces
face name 37.12 Faces
face remapping 37.12.5 Face Remapping
face spec 37.12.2 Defining Faces
face-all-attributes 37.12.3 Face Attribute Functions
face-attribute 37.12.3 Face Attribute Functions
face-attribute-relative-p 37.12.3 Face Attribute Functions
face-background 37.12.3 Face Attribute Functions
face-bold-p 37.12.3 Face Attribute Functions
face-differs-from-default-p 37.12.6 Functions for Working with Faces
face-documentation 23.2 Access to Documentation Strings
face-documentation 37.12.6 Functions for Working with Faces
face-equal 37.12.6 Functions for Working with Faces
face-font 37.12.3 Face Attribute Functions
face-font-family-alternatives 37.12.9 Font Selection
face-font-registry-alternatives 37.12.9 Font Selection
face-font-rescale-alist 37.12.9 Font Selection
face-font-selection-order 37.12.9 Font Selection
face-foreground 37.12.3 Face Attribute Functions
face-id 37.12.6 Functions for Working with Faces
face-inverse-video-p 37.12.3 Face Attribute Functions
face-italic-p 37.12.3 Face Attribute Functions
face-list 37.12.6 Functions for Working with Faces
face-name-history 19.4 Minibuffer History
face-remap-add-relative 37.12.5 Face Remapping
face-remap-remove-relative 37.12.5 Face Remapping
face-remap-reset-base 37.12.5 Face Remapping
face-remap-set-base 37.12.5 Face Remapping
face-remapping-alist 37.12.5 Face Remapping
face-spec-set 37.12.2 Defining Faces
face-stipple 37.12.3 Face Attribute Functions
face-underline-p 37.12.3 Face Attribute Functions
facemenu-keymap 21.6 Prefix Keys
facep 37.12 Faces
faces 37.12 Faces
faces for font lock 22.6.7 Faces for Font Lock
faces, automatic choice 37.12.7 Automatic Face Assignment
false 1.3.2 nil and t
fboundp 12.8 Accessing Function Cell Contents
fceiling 3.7 Rounding Operations
feature-unload-function 15.9 Unloading
featurep 15.7 Features
features 15.7 Features
features 15.7 Features
fetch-bytecode 16.4 Dynamic Loading of Individual Functions
ffloor 3.7 Rounding Operations
field (overlay property) 37.9.2 Overlay Properties
field (text property) 31.19.4 Properties with Special Meanings
field width 4.7 Formatting Strings
field-beginning 31.19.9 Defining and Using Fields
field-end 31.19.9 Defining and Using Fields
field-string 31.19.9 Defining and Using Fields
field-string-no-properties 31.19.9 Defining and Using Fields
fields 31.19.9 Defining and Using Fields
fifo data structure 6.8 Managing a Fixed-Size Ring of Objects
file accessibility 24.6.1 Testing Accessibility
file age 24.6.4 File Attributes
file attributes 24.6.4 File Attributes
file classification 24.6.2 Distinguishing Kinds of Files
file contents, and default coding system 32.10.5 Default Coding Systems
file format conversion 24.12 File Format Conversion
file handler 24.11 Making Certain File Names “Magic”
file hard link 24.7 Changing File Names and Attributes
file local variables 11.11 File Local Variables
file locks 24.5 File Locks
file mode specification error 22.2.2 How Emacs Chooses a Major Mode
file modes 24.6.1 Testing Accessibility
file modes and MS-DOS 24.6.1 Testing Accessibility
file modes, setting 24.7 Changing File Names and Attributes
file modification time 24.6.4 File Attributes
file name abbreviations 24.8.3 Directory Names
file name completion subroutines 24.8.6 File Name Completion
file name of buffer 26.4 Buffer File Name
file name of directory 24.8.3 Directory Names
file name, and default coding system 32.10.5 Default Coding Systems
file names 24.8 File Names
file names in directory 24.9 Contents of Directories
file names, trailing whitespace 24.6 Information about Files
file notifications 38.19 Notifications on File Changes
file open error 24.1.2 Subroutines of Visiting
file permissions 24.6.1 Testing Accessibility
file permissions, setting 24.7 Changing File Names and Attributes
file symbolic links 24.6.2 Distinguishing Kinds of Files
file with multiple names 24.7 Changing File Names and Attributes
file, information about 24.6 Information about Files
file-accessible-directory-p 24.6.1 Testing Accessibility
file-acl 24.6.5 Extended File Attributes
file-already-exists 24.7 Changing File Names and Attributes
file-attributes 24.6.4 File Attributes
file-chase-links 24.6.3 Truenames
file-coding-system-alist 32.10.5 Default Coding Systems
file-directory-p 24.6.2 Distinguishing Kinds of Files
file-equal-p 24.6.3 Truenames
file-error 15.1 How Programs Do Loading
file-executable-p 24.6.1 Testing Accessibility
file-exists-p 24.6.1 Testing Accessibility
file-expand-wildcards 24.9 Contents of Directories
file-extended-attributes 24.6.5 Extended File Attributes
file-in-directory-p 24.6.3 Truenames
file-local-copy 24.11 Making Certain File Names “Magic”
file-local-variables-alist 11.11 File Local Variables
file-locked 24.5 File Locks
file-locked-p 24.5 File Locks
file-modes 24.6.1 Testing Accessibility
file-modes-symbolic-to-number 24.7 Changing File Names and Attributes
file-name encoding, MS-Windows 32.10.2 Encoding and I/O
file-name-absolute-p 24.8.2 Absolute and Relative File Names
file-name-all-completions 24.8.6 File Name Completion
file-name-as-directory 24.8.3 Directory Names
file-name-base 24.8.1 File Name Components
file-name-coding-system 32.10.2 Encoding and I/O
file-name-completion 24.8.6 File Name Completion
file-name-directory 24.8.1 File Name Components
file-name-extension 24.8.1 File Name Components
file-name-handler-alist 24.11 Making Certain File Names “Magic”
file-name-history 19.4 Minibuffer History
file-name-nondirectory 24.8.1 File Name Components
file-name-sans-extension 24.8.1 File Name Components
file-name-sans-versions 24.8.1 File Name Components
file-newer-than-file-p 24.6.4 File Attributes
file-newest-backup 25.1.4 Naming Backup Files
file-nlinks 24.6.4 File Attributes
file-notify-add-watch 38.19 Notifications on File Changes
file-notify-rm-watch 38.19 Notifications on File Changes
file-ownership-preserved-p 24.6.1 Testing Accessibility
file-precious-flag 24.2 Saving Buffers
file-readable-p 24.6.1 Testing Accessibility
file-regular-p 24.6.2 Distinguishing Kinds of Files
file-relative-name 24.8.2 Absolute and Relative File Names
file-remote-p 24.11 Making Certain File Names “Magic”
file-selinux-context 24.6.5 Extended File Attributes
file-supersession 26.6 Buffer Modification Time
file-symlink-p 24.6.2 Distinguishing Kinds of Files
file-truename 24.6.3 Truenames
file-writable-p 24.6.1 Testing Accessibility
fill-column 31.12 Margins for Filling
fill-context-prefix 31.13 Adaptive Fill Mode
fill-forward-paragraph-function 31.11 Filling
fill-individual-paragraphs 31.11 Filling
fill-individual-varying-indent 31.11 Filling
fill-nobreak-predicate 31.12 Margins for Filling
fill-paragraph 31.11 Filling
fill-paragraph-function 31.11 Filling
fill-prefix 31.12 Margins for Filling
fill-region 31.11 Filling
fill-region-as-paragraph 31.11 Filling
fillarray 6.3 Functions that Operate on Arrays
filling text 31.11 Filling
filling, automatic 31.14 Auto Filling
filter function 36.9.2 Process Filter Functions
filter multibyte flag, of process 36.9.3 Decoding Process Output
filter-buffer-substring 31.2 Examining Buffer Contents
filter-buffer-substring-function 31.2 Examining Buffer Contents
filter-buffer-substring-functions 31.2 Examining Buffer Contents
find file in path 24.6.6 Locating Files in Standard Places
find library 15.3 Library Search
find-auto-coding 32.10.5 Default Coding Systems
find-backup-file-name 25.1.4 Naming Backup Files
find-buffer-visiting 26.4 Buffer File Name
find-charset-region 32.8 Scanning for Character Sets
find-charset-string 32.8 Scanning for Character Sets
find-coding-systems-for-charsets 32.10.3 Coding Systems in Lisp
find-coding-systems-region 32.10.3 Coding Systems in Lisp
find-coding-systems-string 32.10.3 Coding Systems in Lisp
find-file 24.1.1 Functions for Visiting Files
find-file-hook 24.1.1 Functions for Visiting Files
find-file-literally 24.1.1 Functions for Visiting Files
find-file-literally 24.1.1 Functions for Visiting Files
find-file-name-handler 24.11 Making Certain File Names “Magic”
find-file-noselect 24.1.1 Functions for Visiting Files
find-file-not-found-functions 24.1.1 Functions for Visiting Files
find-file-other-window 24.1.1 Functions for Visiting Files
find-file-read-only 24.1.1 Functions for Visiting Files
find-file-wildcards 24.1.1 Functions for Visiting Files
find-font 37.12.12 Low-Level Font Representation
find-image 37.17.8 Defining Images
find-operation-coding-system 32.10.5 Default Coding Systems
finding files 24.1 Visiting Files
finding windows 27.9 Cyclic Ordering of Windows
first-change-hook 31.28 Change Hooks
fit-frame-to-buffer 27.4 Resizing Windows
fit-frame-to-buffer 28.3.4 Frame Size And Position
fit-frame-to-buffer-margins 28.3.4 Frame Size And Position
fit-frame-to-buffer-sizes 28.3.4 Frame Size And Position
fit-window-to-buffer 27.4 Resizing Windows
fit-window-to-buffer-horizontally 27.4 Resizing Windows
fixed-size window 27.3 Window Sizes
fixup-whitespace 31.7 User-Level Deletion Commands
flags in format specifications 4.7 Formatting Strings
float 3.5 Numeric Conversions
float-e 3.9 Standard Mathematical Functions
float-output-format 18.6 Variables Affecting Output
float-pi 3.9 Standard Mathematical Functions
float-time 38.5 Time of Day
floating-point functions 3.9 Standard Mathematical Functions
floatp 3.3 Type Predicates for Numbers
floats-consed E.4 Memory Usage
floor 3.5 Numeric Conversions
flowcontrol, in serial connections 36.19 Communicating with Serial Ports
flushing input 20.8.6 Miscellaneous Event Input Features
fmakunbound 12.8 Accessing Function Cell Contents
fn in function’s documentation string 15.5 Autoload
focus event 20.7.9 Focus Events
focus-follows-mouse 28.9 Input Focus
focus-in-hook 28.9 Input Focus
focus-in-hook Appendix H Standard Hooks
focus-out-hook 28.9 Input Focus
focus-out-hook Appendix H Standard Hooks
follow links 31.19.8 Defining Clickable Text
follow-link (button property) 37.18.1 Button Properties
follow-link (text or overlay property) 31.19.8 Defining Clickable Text
following-char 31.1 Examining Text Near Point
font and color, frame parameters 28.3.3.8 Font and Color Parameters
font entity 37.12.12 Low-Level Font Representation
font lock faces 22.6.7 Faces for Font Lock
Font Lock mode 22.6 Font Lock Mode
font lookup 37.12.10 Looking Up Fonts
font object 37.12.12 Low-Level Font Representation
font property 37.12.12 Low-Level Font Representation
font registry 37.12.12 Low-Level Font Representation
font selection 37.12.9 Font Selection
font spec 37.12.12 Low-Level Font Representation
font, a frame parameter 28.3.3.8 Font and Color Parameters
font-at 37.12.12 Low-Level Font Representation
font-backend, a frame parameter 28.3.3.8 Font and Color Parameters
font-face-attributes 37.12.12 Low-Level Font Representation
font-family-list 37.12.1 Face Attributes
font-get 37.12.12 Low-Level Font Representation
font-lock-add-keywords 22.6.3 Customizing Search-Based Fontification
font-lock-beginning-of-syntax-function 22.6.8 Syntactic Font Lock
font-lock-builtin-face 22.6.7 Faces for Font Lock
font-lock-comment-delimiter-face 22.6.7 Faces for Font Lock
font-lock-comment-face 22.6.7 Faces for Font Lock
font-lock-constant-face 22.6.7 Faces for Font Lock
font-lock-defaults 22.6.1 Font Lock Basics
font-lock-doc-face 22.6.7 Faces for Font Lock
font-lock-extend-after-change-region-function 22.6.9.2 Region to Fontify after a Buffer Change
font-lock-extra-managed-props 22.6.4 Other Font Lock Variables
font-lock-face (text property) 31.19.4 Properties with Special Meanings
font-lock-fontify-buffer-function 22.6.4 Other Font Lock Variables
font-lock-fontify-region-function 22.6.4 Other Font Lock Variables
font-lock-function-name-face 22.6.7 Faces for Font Lock
font-lock-keyword-face 22.6.7 Faces for Font Lock
font-lock-keywords 22.6.2 Search-based Fontification
font-lock-keywords-case-fold-search 22.6.2 Search-based Fontification
font-lock-keywords-only 22.6.8 Syntactic Font Lock
font-lock-mark-block-function 22.6.4 Other Font Lock Variables
font-lock-multiline 22.6.9.1 Font Lock Multiline
font-lock-negation-char-face 22.6.7 Faces for Font Lock
font-lock-preprocessor-face 22.6.7 Faces for Font Lock
font-lock-remove-keywords 22.6.3 Customizing Search-Based Fontification
font-lock-string-face 22.6.7 Faces for Font Lock
font-lock-syntactic-face-function 22.6.8 Syntactic Font Lock
font-lock-syntax-table 22.6.8 Syntactic Font Lock
font-lock-type-face 22.6.7 Faces for Font Lock
font-lock-unfontify-buffer-function 22.6.4 Other Font Lock Variables
font-lock-unfontify-region-function 22.6.4 Other Font Lock Variables
font-lock-variable-name-face 22.6.7 Faces for Font Lock
font-lock-warning-face 22.6.7 Faces for Font Lock
font-put 37.12.12 Low-Level Font Representation
font-spec 37.12.12 Low-Level Font Representation
font-xlfd-name 37.12.12 Low-Level Font Representation
fontification-functions 37.12.7 Automatic Face Assignment
fontified (text property) 31.19.4 Properties with Special Meanings
fontp 37.12.12 Low-Level Font Representation
fontset 37.12.11 Fontsets
foo 1.3.7.1 A Sample Function Description
for 13.5.2 Evaluating Macro Arguments Repeatedly
force coding system for operation 32.10.6 Specifying a Coding System for One Operation
force entry to debugger 17.1.4 Explicit Entry to the Debugger
force-mode-line-update 22.4.1 Mode Line Basics
force-window-update 37.2 Forcing Redisplay
forcing redisplay 37.2 Forcing Redisplay
foreground-color, a frame parameter 28.3.3.8 Font and Color Parameters
form 9.1 Introduction to Evaluation
format 4.7 Formatting Strings
format definition 24.12.2 Round-Trip Specification
format of keymaps 21.3 Format of Keymaps
format specification 4.7 Formatting Strings
format, customization keyword 14.4.4 Type Keywords
format-alist 24.12.2 Round-Trip Specification
format-find-file 24.12.2 Round-Trip Specification
format-insert-file 24.12.2 Round-Trip Specification
format-mode-line 22.4.8 Emulating Mode Line Formatting
format-network-address 36.18 Misc Network Facilities
format-seconds 38.7 Parsing and Formatting Times
format-time-string 38.7 Parsing and Formatting Times
format-write-file 24.12.2 Round-Trip Specification
formatting strings 4.7 Formatting Strings
formatting time values 38.7 Parsing and Formatting Times
formfeed 2.3.3.1 Basic Char Syntax
forward-button 37.18.5 Button Buffer Commands
forward-char 29.2.1 Motion by Characters
forward-comment 34.6.1 Motion Commands Based on Parsing
forward-line 29.2.4 Motion by Text Lines
forward-list 29.2.6 Moving over Balanced Expressions
forward-sexp 29.2.6 Moving over Balanced Expressions
forward-to-indentation 31.17.6 Indentation-Based Motion Commands
forward-word 29.2.2 Motion by Words
frame 28 Frames
frame configuration 28.12 Frame Configurations
frame creation 28.1 Creating Frames
frame layout parameters 28.3.3.4 Layout Parameters
frame parameters 28.3 Frame Parameters
frame parameters for windowed displays 28.3.3 Window Frame Parameters
frame position 28.3.3.2 Position Parameters
frame size 28.3.4 Frame Size And Position
frame title 28.5 Frame Titles
frame visibility 28.10 Visibility of Frames
frame without a minibuffer 28.8 Minibuffers and Frames
frame, which buffers to display 28.3.3.5 Buffer Parameters
frame-alpha-lower-limit 28.3.3.8 Font and Color Parameters
frame-auto-hide-function 27.17 Quitting Windows
frame-char-height 28.3.4 Frame Size And Position
frame-char-width 28.3.4 Frame Size And Position
frame-current-scroll-bars 37.14 Scroll Bars
frame-first-window 27.2 Windows and Frames
frame-height 28.3.4 Frame Size And Position
frame-inherited-parameters 28.1 Creating Frames
frame-list 28.7 Finding All Frames
frame-live-p 28.6 Deleting Frames
frame-monitor-attributes 28.2 Multiple Terminals
frame-parameter 28.3.1 Access to Frame Parameters
frame-parameters 28.3.1 Access to Frame Parameters
frame-pixel-height 28.3.4 Frame Size And Position
frame-pixel-width 28.3.4 Frame Size And Position
frame-pointer-visible-p 28.14 Mouse Position
frame-relative coordinate 27.23 Coordinates and Windows
frame-resize-pixelwise 28.3.4 Frame Size And Position
frame-root-window 27.2 Windows and Frames
frame-selected-window 27.8 Selecting Windows
frame-terminal 28 Frames
frame-title-format 28.5 Frame Titles
frame-visible-p 28.10 Visibility of Frames
frame-width 28.3.4 Frame Size And Position
framep 28 Frames
frames, scanning all 28.7 Finding All Frames
free list E.3 Garbage Collection
free variable 11.9.4 Using Lexical Binding
frequency counts 17.2.13 Coverage Testing
frexp 3.2 Floating-Point Basics
fringe bitmaps 37.13.4 Fringe Bitmaps
fringe bitmaps, customizing 37.13.5 Customizing Fringe Bitmaps
fringe cursors 37.13.3 Fringe Cursors
fringe indicators 37.13.2 Fringe Indicators
fringe-bitmaps-at-pos 37.13.4 Fringe Bitmaps
fringe-cursor-alist 37.13.3 Fringe Cursors
fringe-indicator-alist 37.13.2 Fringe Indicators
fringes 37.13 Fringes
fringes, and empty line indication 37.13.2 Fringe Indicators
fringes-outside-margins 37.13.1 Fringe Size and Position
fround 3.7 Rounding Operations
fset 12.8 Accessing Function Cell Contents
ftp-login 10.5.4 Cleaning Up from Nonlocal Exits
ftruncate 3.7 Rounding Operations
full keymap 21.3 Format of Keymaps
full-height window 27.3 Window Sizes
full-screen frames 28.3.3.3 Size Parameters
full-width window 27.3 Window Sizes
fullscreen, a frame parameter 28.3.3.3 Size Parameters
funcall 12.5 Calling Functions
funcall, and debugging 17.1.8 Internals of the Debugger
function 12.7 Anonymous Functions
function aliases 12.4 Defining Functions
function call 9.2.5 Evaluation of Function Forms
function call debugging 17.1.3 Entering the Debugger on a Function Call
function cell 8.1 Symbol Components
function cell in autoload 15.5 Autoload
function declaration 12.14 Telling the Compiler that a Function is Defined
function definition 12.3 Naming a Function
function descriptions 1.3.7.1 A Sample Function Description
function form evaluation 9.2.5 Evaluation of Function Forms
function input stream 18.2 Input Streams
function invocation 12.5 Calling Functions
function keys 20.7.2 Function Keys
function name 12.3 Naming a Function
function output stream 18.4 Output Streams
function quoting 12.7 Anonymous Functions
function safety 12.15 Determining whether a Function is Safe to Call
function-documentation property 23.1 Documentation Basics
function-get 8.4.1 Accessing Symbol Properties
functionals 12.5 Calling Functions
functionp 12.1 What Is a Function?
functions in modes 22.2.1 Major Mode Conventions
functions, making them interactive 20.2 Defining Commands
fundamental-mode 22.2 Major Modes
fundamental-mode-abbrev-table 35.5 Standard Abbrev Tables

G
gamma correction 28.3.3.8 Font and Color Parameters
gap-position 26.13 The Buffer Gap
gap-size 26.13 The Buffer Gap
garbage collection E.3 Garbage Collection
garbage collection protection E.6 Writing Emacs Primitives
garbage-collect E.3 Garbage Collection
garbage-collection-messages E.3 Garbage Collection
gc-cons-percentage E.3 Garbage Collection
gc-cons-threshold E.3 Garbage Collection
gc-elapsed E.3 Garbage Collection
GCPRO and UNGCPRO E.6 Writing Emacs Primitives
gcs-done E.3 Garbage Collection
generalized variable 11.15 Generalized Variables
generate-autoload-cookie 15.5 Autoload
generate-new-buffer 26.9 Creating Buffers
generate-new-buffer-name 26.3 Buffer Names
generated-autoload-file 15.5 Autoload
generic commands 20.2.4 Select among Command Alternatives
generic mode 22.2.8 Generic Modes
geometry specification 28.3.5 Geometry
get 8.4.1 Accessing Symbol Properties
get, defcustom keyword 14.3 Defining Customization Variables
get-buffer 26.3 Buffer Names
get-buffer-create 26.9 Creating Buffers
get-buffer-process 36.9.1 Process Buffers
get-buffer-window 27.10 Buffers and Windows
get-buffer-window-list 27.10 Buffers and Windows
get-byte 32.5 Character Codes
get-char-code-property 32.6 Character Properties
get-char-property 31.19.1 Examining Text Properties
get-char-property-and-overlay 31.19.1 Examining Text Properties
get-charset-property 32.7 Character Sets
get-device-terminal 28.2 Multiple Terminals
get-file-buffer 26.4 Buffer File Name
get-internal-run-time 38.8 Processor Run time
get-largest-window 27.9 Cyclic Ordering of Windows
get-load-suffixes 15.2 Load Suffixes
get-lru-window 27.9 Cyclic Ordering of Windows
get-pos-property 31.19.1 Examining Text Properties
get-process 36.6 Process Information
get-register 31.21 Registers
get-text-property 31.19.1 Examining Text Properties
get-unused-category 34.8 Categories
get-window-with-predicate 27.9 Cyclic Ordering of Windows
getenv 38.3 Operating System Environment
gethash 7.2 Hash Table Access
GID 38.4 User Identification
global binding 11.3 Local Variables
global break condition 17.2.6.2 Global Break Condition
global keymap 21.7 Active Keymaps
global variable 11.1 Global Variables
global-abbrev-table 35.5 Standard Abbrev Tables
global-buffers-menu-map Appendix G Standard Keymaps
global-disable-point-adjustment 20.6 Adjusting Point After Commands
global-key-binding 21.11 Functions for Key Lookup
global-map 21.9 Controlling the Active Keymaps
global-mode-string 22.4.4 Variables Used in the Mode Line
global-set-key 21.15 Commands for Binding Keys
global-unset-key 21.15 Commands for Binding Keys
glyph 37.21.4 Glyphs
glyph code 37.21.4 Glyphs
glyph-char 37.21.4 Glyphs
glyph-face 37.21.4 Glyphs
glyph-table 37.21.4 Glyphs
glyphless characters 37.21.5 Glyphless Character Display
glyphless-char-display 37.21.5 Glyphless Character Display
glyphless-char-display-control 37.21.5 Glyphless Character Display
goto-char 29.2.1 Motion by Characters
goto-map 21.6 Prefix Keys
grammar, SMIE 22.7.1.3 Defining the Grammar of a Language
graphical display 28 Frames
graphical terminal 28 Frames
group, customization keyword 14.1 Common Item Keywords
group-gid 38.4 User Identification
group-real-gid 38.4 User Identification
gv-define-expander 11.15.2 Defining new setf forms
gv-define-setter 11.15.2 Defining new setf forms
gv-define-simple-setter 11.15.2 Defining new setf forms
gv-letplace 11.15.2 Defining new setf forms

H
hack-dir-local-variables 11.12 Directory Local Variables
hack-dir-local-variables-non-file-buffer 11.12 Directory Local Variables
hack-local-variables 11.11 File Local Variables
hack-local-variables-hook 11.11 File Local Variables
handle-shift-selection 30.7 The Mark
handle-switch-frame 28.9 Input Focus
handling errors 10.5.3.3 Writing Code to Handle Errors
hash code 7.3 Defining Hash Comparisons
hash notation 2.1 Printed Representation and Read Syntax
hash table access 7.2 Hash Table Access
hash tables 7 Hash Tables
hash, cryptographic 31.25 Checksum/Hash
hash-table-count 7.4 Other Hash Table Functions
hash-table-p 7.4 Other Hash Table Functions
hash-table-rehash-size 7.4 Other Hash Table Functions
hash-table-rehash-threshold 7.4 Other Hash Table Functions
hash-table-size 7.4 Other Hash Table Functions
hash-table-test 7.4 Other Hash Table Functions
hash-table-weakness 7.4 Other Hash Table Functions
hashing 8.3 Creating and Interning Symbols
header comments D.8 Conventional Headers for Emacs Libraries
header line (of a window) 22.4.7 Window Header Lines
header-line prefix key 20.8.1 Key Sequence Input
header-line-format 22.4.7 Window Header Lines
height of a line 37.11 Line Height
height of a window 27.3 Window Sizes
height spec 37.11 Line Height
height, a frame parameter 28.3.3.3 Size Parameters
help for major mode 22.2.3 Getting Help about a Major Mode
help functions 23.5 Help Functions
help-buffer 23.5 Help Functions
help-char 23.5 Help Functions
help-command 23.5 Help Functions
help-echo (overlay property) 37.9.2 Overlay Properties
help-echo (text property) 31.19.4 Properties with Special Meanings
help-echo event 20.7.10 Miscellaneous System Events
help-echo, customization keyword 14.4.4 Type Keywords
help-event-list 23.5 Help Functions
help-form 23.5 Help Functions
help-index (button property) 37.18.1 Button Properties
help-map 23.5 Help Functions
help-setup-xref 23.5 Help Functions
help-window-select 23.5 Help Functions
Helper-describe-bindings 23.5 Help Functions
Helper-help 23.5 Help Functions
Helper-help-map 23.5 Help Functions
hex numbers 3.1 Integer Basics
hidden buffers 26.3 Buffer Names
history list 19.4 Minibuffer History
history of commands 20.15 Command History
history-add-new-input 19.4 Minibuffer History
history-delete-duplicates 19.4 Minibuffer History
history-length 19.4 Minibuffer History
HOME environment variable 36.1 Functions that Create Subprocesses
hook variables, list of Appendix H Standard Hooks
hooks 22.1 Hooks
hooks for changing a character 31.19.4 Properties with Special Meanings
hooks for loading 15.10 Hooks for Loading
hooks for motion of point 31.19.4 Properties with Special Meanings
hooks for text changes 31.28 Change Hooks
hooks for window operations 27.26 Hooks for Window Scrolling and Changes
horizontal combination 27.2 Windows and Frames
horizontal position 31.16 Counting Columns
horizontal scrolling 27.22 Horizontal Scrolling
horizontal-scroll-bar prefix key 20.8.1 Key Sequence Input
how to visit files 24.1.1 Functions for Visiting Files
hyper characters 2.3.3.5 Other Character Modifier Bits
hyperlinks in documentation strings D.6 Tips for Documentation Strings

I
icon-left, a frame parameter 28.3.3.2 Position Parameters
icon-name, a frame parameter 28.3.3.6 Window Management Parameters
icon-title-format 28.5 Frame Titles
icon-top, a frame parameter 28.3.3.2 Position Parameters
icon-type, a frame parameter 28.3.3.6 Window Management Parameters
iconified frame 28.10 Visibility of Frames
iconify-frame 28.10 Visibility of Frames
iconify-frame event 20.7.10 Miscellaneous System Events
identity 12.5 Calling Functions
idle timers 38.11 Idle Timers
idleness 38.11 Idle Timers
IEEE floating point 3.2 Floating-Point Basics
if 10.2 Conditionals
ignore 12.5 Calling Functions
ignore-errors 10.5.3.3 Writing Code to Handle Errors
ignore-window-parameters 27.25 Window Parameters
ignored-local-variables 11.11 File Local Variables
image animation 37.17.10 Multi-Frame Images
image cache 37.17.11 Image Cache
image descriptor 37.17.2 Image Descriptors
image formats 37.17.1 Image Formats
image frames 37.17.10 Multi-Frame Images
image maps 37.17.2 Image Descriptors
image slice 37.17.9 Showing Images
image types 37.17.1 Image Formats
image-animate 37.17.10 Multi-Frame Images
image-animate-timer 37.17.10 Multi-Frame Images
image-cache-eviction-delay 37.17.11 Image Cache
image-current-frame 37.17.10 Multi-Frame Images
image-default-frame-delay 37.17.10 Multi-Frame Images
image-flush 37.17.11 Image Cache
image-format-suffixes 37.17.6 ImageMagick Images
image-load-path 37.17.8 Defining Images
image-load-path-for-library 37.17.8 Defining Images
image-mask-p 37.17.2 Image Descriptors
image-minimum-frame-delay 37.17.10 Multi-Frame Images
image-multi-frame-p 37.17.10 Multi-Frame Images
image-show-frame 37.17.10 Multi-Frame Images
image-size 37.17.9 Showing Images
image-type-available-p 37.17.1 Image Formats
image-types 37.17.1 Image Formats
ImageMagick images 37.17.6 ImageMagick Images
imagemagick-enabled-types 37.17.6 ImageMagick Images
imagemagick-types 37.17.6 ImageMagick Images
imagemagick-types-inhibit 37.17.6 ImageMagick Images
images in buffers 37.17 Images
images, support for more formats 37.17.6 ImageMagick Images
Imenu 22.5 Imenu
imenu-add-to-menubar 22.5 Imenu
imenu-case-fold-search 22.5 Imenu
imenu-create-index-function 22.5 Imenu
imenu-extract-index-name-function 22.5 Imenu
imenu-generic-expression 22.5 Imenu
imenu-prev-index-position-function 22.5 Imenu
imenu-syntax-alist 22.5 Imenu
implicit progn 10.1 Sequencing
inactive minibuffer 19.1 Introduction to Minibuffers
inc 13.1 A Simple Example of a Macro
indefinite extent 11.9 Scoping Rules for Variable Bindings
indent-according-to-mode 31.17.2 Indentation Controlled by Major Mode
indent-code-rigidly 31.17.3 Indenting an Entire Region
indent-for-tab-command 31.17.2 Indentation Controlled by Major Mode
indent-line-function 31.17.2 Indentation Controlled by Major Mode
indent-region 31.17.3 Indenting an Entire Region
indent-region-function 31.17.3 Indenting an Entire Region
indent-relative 31.17.4 Indentation Relative to Previous Lines
indent-relative-maybe 31.17.4 Indentation Relative to Previous Lines
indent-rigidly 31.17.3 Indenting an Entire Region
indent-tabs-mode 31.17.1 Indentation Primitives
indent-to 31.17.1 Indentation Primitives
indent-to-left-margin 31.12 Margins for Filling
indentation 31.17 Indentation
indentation rules, SMIE 22.7.1.6 Specifying Indentation Rules
indicate-buffer-boundaries 37.13.2 Fringe Indicators
indicate-empty-lines 37.13.2 Fringe Indicators
indicators, fringe 37.13.2 Fringe Indicators
indirect buffers 26.11 Indirect Buffers
indirect specifications 17.2.15.2 Specification List
indirect-function 9.2.4 Symbol Function Indirection
indirect-variable 11.13 Variable Aliases
indirection for functions 9.2.4 Symbol Function Indirection
infinite loops 17.1.2 Debugging Infinite Loops
infinite recursion 11.3 Local Variables
infinity 3.2 Floating-Point Basics
inheritance, for faces 37.12.1 Face Attributes
inheritance, keymap 21.5 Inheritance and Keymaps
inheritance, syntax table 34.1 Syntax Table Concepts
inheritance, text property 31.19.6 Stickiness of Text Properties
inhibit-default-init 38.1.2 The Init File
inhibit-eol-conversion 32.10.6 Specifying a Coding System for One Operation
inhibit-field-text-motion 29.2.2 Motion by Words
inhibit-file-name-handlers 24.11 Making Certain File Names “Magic”
inhibit-file-name-operation 24.11 Making Certain File Names “Magic”
inhibit-iso-escape-detection 32.10.3 Coding Systems in Lisp
inhibit-local-variables-regexps 11.11 File Local Variables
inhibit-local-variables-regexps 22.2.2 How Emacs Chooses a Major Mode
inhibit-modification-hooks 31.28 Change Hooks
inhibit-null-byte-detection 32.10.3 Coding Systems in Lisp
inhibit-point-motion-hooks 31.19.4 Properties with Special Meanings
inhibit-quit 20.11 Quitting
inhibit-read-only 26.7 Read-Only Buffers
inhibit-splash-screen 38.1.1 Summary: Sequence of Actions at Startup
inhibit-startup-echo-area-message 38.1.1 Summary: Sequence of Actions at Startup
inhibit-startup-message 38.1.1 Summary: Sequence of Actions at Startup
inhibit-startup-screen 38.1.1 Summary: Sequence of Actions at Startup
inhibit-x-resources 28.22 X Resources
init file 38.1.2 The Init File
init-file-user 38.4 User Identification
init.el 38.1.2 The Init File
initial-buffer-choice 38.1.1 Summary: Sequence of Actions at Startup
initial-environment 38.3 Operating System Environment
initial-frame-alist 28.3.2 Initial Frame Parameters
initial-major-mode 22.2.2 How Emacs Chooses a Major Mode
initial-scratch-message 38.1.1 Summary: Sequence of Actions at Startup
initial-window-system 37.23 Window Systems
initial-window-system, and startup 38.1.1 Summary: Sequence of Actions at Startup
initialization of Emacs 38.1.1 Summary: Sequence of Actions at Startup
initialize, defcustom keyword 14.3 Defining Customization Variables
inline completion 19.6.8 Completion in Ordinary Buffers
inline functions 12.12 Inline Functions
innermost containing parentheses 34.6.3 Parser State
input events 20.7 Input Events
input focus 28.9 Input Focus
input methods 32.11 Input Methods
input modes 38.12.1 Input Modes
input stream 18.2 Input Streams
input-decode-map 21.14 Keymaps for Translating Sequences of Events
input-method-alist 32.11 Input Methods
input-method-function 20.8.4 Invoking the Input Method
input-pending-p 20.8.6 Miscellaneous Event Input Features
insert 31.4 Inserting Text
insert-abbrev-table-description 35.1 Abbrev Tables
insert-and-inherit 31.19.6 Stickiness of Text Properties
insert-before-markers 31.4 Inserting Text
insert-before-markers-and-inherit 31.19.6 Stickiness of Text Properties
insert-behind-hooks (overlay property) 37.9.2 Overlay Properties
insert-behind-hooks (text property) 31.19.4 Properties with Special Meanings
insert-buffer 31.5 User-Level Insertion Commands
insert-buffer-substring 31.4 Inserting Text
insert-buffer-substring-as-yank 31.8.3 Yanking
insert-buffer-substring-no-properties 31.4 Inserting Text
insert-button 37.18.3 Making Buttons
insert-char 31.4 Inserting Text
insert-default-directory 19.6.5 Reading File Names
insert-directory 24.9 Contents of Directories
insert-directory-program 24.9 Contents of Directories
insert-file-contents 24.3 Reading from Files
insert-file-contents-literally 24.3 Reading from Files
insert-for-yank 31.8.3 Yanking
insert-image 37.17.9 Showing Images
insert-in-front-hooks (overlay property) 37.9.2 Overlay Properties
insert-in-front-hooks (text property) 31.19.4 Properties with Special Meanings
insert-register 31.21 Registers
insert-sliced-image 37.17.9 Showing Images
insert-text-button 37.18.3 Making Buttons
inserting killed text 31.8.4 Functions for Yanking
insertion before point 31.4 Inserting Text
insertion of text 31.4 Inserting Text
insertion type of a marker 30.5 Marker Insertion Types
inside comment 34.6.3 Parser State
inside string 34.6.3 Parser State
installation-directory 38.3 Operating System Environment
instrumenting for Edebug 17.2.2 Instrumenting for Edebug
int-to-string 4.6 Conversion of Characters and Strings
intangible (overlay property) 37.9.2 Overlay Properties
intangible (text property) 31.19.4 Properties with Special Meanings
integer to decimal 4.6 Conversion of Characters and Strings
integer to hexadecimal 4.7 Formatting Strings
integer to octal 4.7 Formatting Strings
integer to string 4.6 Conversion of Characters and Strings
integer types (C programming language) E.8 C Integer Types
integer-or-marker-p 30.2 Predicates on Markers
integerp 3.3 Type Predicates for Numbers
integers 3 Numbers
integers in specific radix 3.1 Integer Basics
interactive 20.2.1 Using interactive
interactive call 20.3 Interactive Call
interactive code description 20.2.2 Code Characters for interactive
interactive completion 20.2.2 Code Characters for interactive
interactive function 20.2 Defining Commands
interactive spec, using 20.2.1 Using interactive
interactive specification in primitives E.6 Writing Emacs Primitives
interactive, examples of using 20.2.3 Examples of Using interactive
interactive-form 20.2.1 Using interactive
interactive-form property 20.2 Defining Commands
interactive-form, symbol property 20.2.1 Using interactive
interactive-only property 20.2 Defining Commands
intern 8.3 Creating and Interning Symbols
intern-soft 8.3 Creating and Interning Symbols
internal representation of characters 32.1 Text Representations
internal windows 27.1 Basic Concepts of Emacs Windows
internal-border-width, a frame parameter 28.3.3.4 Layout Parameters
internals, of buffer E.7.1 Buffer Internals
internals, of process E.7.3 Process Internals
internals, of window E.7.2 Window Internals
interning 8.3 Creating and Interning Symbols
interpreter 9 Evaluation
interpreter 9 Evaluation
interpreter-mode-alist 22.2.2 How Emacs Chooses a Major Mode
interprogram-cut-function 31.8.5 Low-Level Kill Ring
interprogram-paste-function 31.8.5 Low-Level Kill Ring
interrupt Lisp functions 20.11 Quitting
interrupt-process 36.8 Sending Signals to Processes
intervals 31.19.10 Why Text Properties are not Intervals
intervals-consed E.4 Memory Usage
invalid prefix key error 21.12 Changing Key Bindings
invalid-function 9.2.4 Symbol Function Indirection
invalid-read-syntax 2.1 Printed Representation and Read Syntax
invalid-regexp 33.3.1.3 Backslash Constructs in Regular Expressions
invert-face 37.12.3 Face Attribute Functions
invisible (overlay property) 37.9.2 Overlay Properties
invisible (text property) 31.19.4 Properties with Special Meanings
invisible frame 28.10 Visibility of Frames
invisible text 37.6 Invisible Text
invisible-p 37.6 Invisible Text
invisible/intangible text, and point 20.6 Adjusting Point After Commands
invocation-directory 38.3 Operating System Environment
invocation-name 38.3 Operating System Environment
invoking input method 20.8.4 Invoking the Input Method
invoking lisp debugger 17.1.7 Invoking the Debugger
is this call interactive 20.4 Distinguish Interactive Calls
isnan 3.2 Floating-Point Basics
italic text 37.12.1 Face Attributes
iteration 10.4 Iteration

J
jit-lock-register 22.6.4 Other Font Lock Variables
jit-lock-unregister 22.6.4 Other Font Lock Variables
joining lists 5.6.3 Functions that Rearrange Lists
jumbled display of bidirectional text 37.24 Bidirectional Display
just-one-space 31.7 User-Level Deletion Commands
justify-current-line 31.11 Filling

K
kbd 21.1 Key Sequences
kbd-macro-termination-hook 20.16 Keyboard Macros
kept-new-versions 25.1.3 Making and Deleting Numbered Backup Files
kept-old-versions 25.1.3 Making and Deleting Numbered Backup Files
key 21.1 Key Sequences
key binding 21.2 Keymap Basics
key binding, conventions for D.2 Key Binding Conventions
key lookup 21.10 Key Lookup
key sequence 21.1 Key Sequences
key sequence error 21.12 Changing Key Bindings
key sequence input 20.8.1 Key Sequence Input
key substitution sequence 23.3 Substituting Key Bindings in Documentation
key translation function 21.14 Keymaps for Translating Sequences of Events
key-binding 21.7 Active Keymaps
key-description 23.4 Describing Characters for Help Messages
key-translation-map 21.14 Keymaps for Translating Sequences of Events
keyboard events 20.7.1 Keyboard Events
keyboard events in strings 20.7.15 Putting Keyboard Events in Strings
keyboard events, data in 20.7.13 Accessing Mouse Events
keyboard input 20.8 Reading Input
keyboard input decoding on X 32.12 Locales
keyboard macro execution 20.3 Interactive Call
keyboard macro termination 37.22 Beeping
keyboard macro, terminating 20.8.6 Miscellaneous Event Input Features
keyboard macros 20.16 Keyboard Macros
keyboard macros (Edebug) 17.2.3 Edebug Execution Modes
keyboard-coding-system 32.10.8 Terminal I/O Encoding
keyboard-quit 20.11 Quitting
keyboard-translate 20.8.3 Modifying and Translating Input Events
keyboard-translate-table 20.8.3 Modifying and Translating Input Events
keymap 21 Keymaps
keymap (button property) 37.18.1 Button Properties
keymap (overlay property) 37.9.2 Overlay Properties
keymap (text property) 31.19.4 Properties with Special Meanings
keymap entry 21.10 Key Lookup
keymap format 21.3 Format of Keymaps
keymap in keymap 21.10 Key Lookup
keymap inheritance 21.5 Inheritance and Keymaps
keymap inheritance from multiple maps 21.5 Inheritance and Keymaps
keymap of character 31.19.4 Properties with Special Meanings
keymap of character (and overlays) 37.9.2 Overlay Properties
keymap prompt string 21.3 Format of Keymaps
keymap-parent 21.5 Inheritance and Keymaps
keymap-prompt 21.17.1 Defining Menus
keymapp 21.3 Format of Keymaps
keymaps for translating events 21.14 Keymaps for Translating Sequences of Events
keymaps in modes 22.2.1 Major Mode Conventions
keymaps, scanning 21.16 Scanning Keymaps
keymaps, standard Appendix G Standard Keymaps
keys in documentation strings 23.3 Substituting Key Bindings in Documentation
keys, reserved D.2 Key Binding Conventions
keystroke 21.1 Key Sequences
keyword symbol 11.2 Variables that Never Change
keywordp 11.2 Variables that Never Change
kill command repetition 20.5 Information from the Command Loop
kill ring 31.8 The Kill Ring
kill-all-local-variables 11.10.2 Creating and Deleting Buffer-Local Bindings
kill-append 31.8.5 Low-Level Kill Ring
kill-buffer 26.10 Killing Buffers
kill-buffer-hook 26.10 Killing Buffers
kill-buffer-query-functions 26.10 Killing Buffers
kill-emacs 38.2.1 Killing Emacs
kill-emacs-hook 38.2.1 Killing Emacs
kill-emacs-query-functions 38.2.1 Killing Emacs
kill-local-variable 11.10.2 Creating and Deleting Buffer-Local Bindings
kill-new 31.8.5 Low-Level Kill Ring
kill-process 36.8 Sending Signals to Processes
kill-read-only-ok 31.8.2 Functions for Killing
kill-region 31.8.2 Functions for Killing
kill-ring 31.8.6 Internals of the Kill Ring
kill-ring-max 31.8.6 Internals of the Kill Ring
kill-ring-yank-pointer 31.8.6 Internals of the Kill Ring
killing buffers 26.10 Killing Buffers
killing Emacs 38.2.1 Killing Emacs
kmacro-keymap Appendix G Standard Keymaps

L
lambda 12.7 Anonymous Functions
lambda expression 12.2 Lambda Expressions
lambda in debug 17.1.7 Invoking the Debugger
lambda in keymap 21.10 Key Lookup
lambda list 12.2.1 Components of a Lambda Expression
lambda-list (Edebug) 17.2.15.2 Specification List
language-change event 20.7.10 Miscellaneous System Events
largest Lisp integer 3.1 Integer Basics
largest window 27.9 Cyclic Ordering of Windows
last 5.3 Accessing Elements of Lists
last-abbrev 35.4 Looking Up and Expanding Abbreviations
last-abbrev-location 35.4 Looking Up and Expanding Abbreviations
last-abbrev-text 35.4 Looking Up and Expanding Abbreviations
last-buffer 26.8 The Buffer List
last-coding-system-used 32.10.2 Encoding and I/O
last-command 20.5 Information from the Command Loop
last-command-event 20.5 Information from the Command Loop
last-event-frame 20.5 Information from the Command Loop
last-input-event 20.8.6 Miscellaneous Event Input Features
last-kbd-macro 20.16 Keyboard Macros
last-nonmenu-event 20.5 Information from the Command Loop
last-prefix-arg 20.12 Prefix Command Arguments
last-repeatable-command 20.5 Information from the Command Loop
lax-plist-get 5.9.2 Property Lists Outside Symbols
lax-plist-put 5.9.2 Property Lists Outside Symbols
layout on display, and bidirectional text 37.24 Bidirectional Display
layout parameters of frames 28.3.3.4 Layout Parameters
lazy loading 16.4 Dynamic Loading of Individual Functions
lazy-completion-table 19.6.1 Basic Completion Functions
ldexp 3.2 Floating-Point Basics
least recently used window 27.9 Cyclic Ordering of Windows
left, a frame parameter 28.3.3.2 Position Parameters
left-fringe, a frame parameter 28.3.3.4 Layout Parameters
left-fringe-width 37.13.1 Fringe Size and Position
left-margin 31.12 Margins for Filling
left-margin-width 37.16.5 Displaying in the Margins
length 6.1 Sequences
let 11.3 Local Variables
let* 11.3 Local Variables
lexical binding 11.9 Scoping Rules for Variable Bindings
lexical binding (Edebug) 17.2.9 Evaluation
lexical comparison 4.5 Comparison of Characters and Strings
lexical environment 11.9.3 Lexical Binding
lexical scope 11.9 Scoping Rules for Variable Bindings
lexical-binding 11.9.4 Using Lexical Binding
library 15 Loading
library compilation 16.2 Byte-Compilation Functions
library header comments D.8 Conventional Headers for Emacs Libraries
library search 15.3 Library Search
libxml-parse-html-region 31.26 Parsing HTML and XML
libxml-parse-xml-region 31.26 Parsing HTML and XML
line end conversion 32.10.1 Basic Concepts of Coding Systems
line height 37.11 Line Height
line number 29.2.4 Motion by Text Lines
line truncation 37.3 Truncation
line wrapping 37.3 Truncation
line-beginning-position 29.2.4 Motion by Text Lines
line-end-position 29.2.4 Motion by Text Lines
line-height (text property) 31.19.4 Properties with Special Meanings
line-height (text property) 37.11 Line Height
line-move-ignore-invisible 37.6 Invisible Text
line-number-at-pos 29.2.4 Motion by Text Lines
line-prefix 37.3 Truncation
line-spacing 37.11 Line Height
line-spacing (text property) 31.19.4 Properties with Special Meanings
line-spacing (text property) 37.11 Line Height
line-spacing, a frame parameter 28.3.3.4 Layout Parameters
lines 29.2.4 Motion by Text Lines
lines in region 29.2.4 Motion by Text Lines
link, customization keyword 14.1 Common Item Keywords
linked list 2.3.6 Cons Cell and List Types
linking files 24.7 Changing File Names and Attributes
Lisp debugger 17.1 The Lisp Debugger
Lisp expression motion 29.2.6 Moving over Balanced Expressions
Lisp history 1.2 Lisp History
Lisp library 15 Loading
Lisp nesting error 9.5 Eval
Lisp object 2 Lisp Data Types
Lisp package 39 Preparing Lisp code for distribution
Lisp printer 18.5 Output Functions
Lisp reader 18.1 Introduction to Reading and Printing
lisp variables defined in C, restrictions 11.14 Variables with Restricted Values
lisp-mode-abbrev-table 35.5 Standard Abbrev Tables
lisp-mode.el 22.2.9 Major Mode Examples
list 5.4 Building Cons Cells and Lists
list all coding systems 32.10.3 Coding Systems in Lisp
list elements 5.3 Accessing Elements of Lists
list form evaluation 9.2.3 Classification of List Forms
list in keymap 21.10 Key Lookup
list length 6.1 Sequences
list modification 5.5 Modifying List Variables
list motion 29.2.6 Moving over Balanced Expressions
list predicates 5.2 Predicates on Lists
list structure 2.3.6 Cons Cell and List Types
list structure 5.1 Lists and Cons Cells
list, replace element 5.6.1 Altering List Elements with setcar
list-buffers-directory 26.4 Buffer File Name
list-charset-chars 32.7 Character Sets
list-fonts 37.12.12 Low-Level Font Representation
list-load-path-shadows 15.3 Library Search
list-processes 36.6 Process Information
list-system-processes 36.12 Accessing Other Processes
listify-key-sequence 20.8.6 Miscellaneous Event Input Features
listing all buffers 26.8 The Buffer List
listp 5.2 Predicates on Lists
lists 5 Lists
lists and cons cells 5.1 Lists and Cons Cells
lists as sets 5.7 Using Lists as Sets
literal evaluation 9.2.1 Self-Evaluating Forms
little endian 36.20.1 Describing Data Layout
live buffer 26.10 Killing Buffers
live windows 27.1 Basic Concepts of Emacs Windows
ln 24.7 Changing File Names and Attributes
load 15.1 How Programs Do Loading
load error with require 15.7 Features
load errors 15.1 How Programs Do Loading
load, customization keyword 14.1 Common Item Keywords
load-average 38.3 Operating System Environment
load-file 15.1 How Programs Do Loading
load-file-name 15.1 How Programs Do Loading
load-file-rep-suffixes 15.2 Load Suffixes
load-history 15.8 Which File Defined a Certain Symbol
load-in-progress 15.1 How Programs Do Loading
load-library 15.1 How Programs Do Loading
load-path 15.3 Library Search
load-prefer-newer 15.2 Load Suffixes
load-read-function 15.1 How Programs Do Loading
load-suffixes 15.2 Load Suffixes
load-theme 14.6 Custom Themes
loading 15 Loading
loading hooks 15.10 Hooks for Loading
loading, and non-ASCII characters 15.4 Loading Non-ASCII Characters
loadup.el E.1 Building Emacs
local binding 11.3 Local Variables
local keymap 21.7 Active Keymaps
local variables 11.3 Local Variables
local variables, killed by major mode 11.10.2 Creating and Deleting Buffer-Local Bindings
local-abbrev-table 35.5 Standard Abbrev Tables
local-function-key-map 21.14 Keymaps for Translating Sequences of Events
local-key-binding 21.11 Functions for Key Lookup
local-map (overlay property) 37.9.2 Overlay Properties
local-map (text property) 31.19.4 Properties with Special Meanings
local-set-key 21.15 Commands for Binding Keys
local-unset-key 21.15 Commands for Binding Keys
local-variable-if-set-p 11.10.2 Creating and Deleting Buffer-Local Bindings
local-variable-p 11.10.2 Creating and Deleting Buffer-Local Bindings
locale 32.12 Locales
locale-coding-system 32.12 Locales
locale-info 32.12 Locales
locate file in path 24.6.6 Locating Files in Standard Places
locate-file 24.6.6 Locating Files in Standard Places
locate-library 15.3 Library Search
locate-user-emacs-file 24.8.7 Standard File Names
lock file 24.5 File Locks
lock-buffer 24.5 File Locks
log 3.9 Standard Mathematical Functions
logand 3.8 Bitwise Operations on Integers
logb 3.2 Floating-Point Basics
logging echo-area messages 37.4.3 Logging Messages in *Messages*
logical arithmetic 3.8 Bitwise Operations on Integers
logical order 37.24 Bidirectional Display
logical shift 3.8 Bitwise Operations on Integers
logior 3.8 Bitwise Operations on Integers
lognot 3.8 Bitwise Operations on Integers
logxor 3.8 Bitwise Operations on Integers
looking up abbrevs 35.4 Looking Up and Expanding Abbreviations
looking up fonts 37.12.10 Looking Up Fonts
looking-at 33.4 Regular Expression Searching
looking-at-p 33.4 Regular Expression Searching
looking-back 33.4 Regular Expression Searching
lookup tables 7 Hash Tables
lookup-key 21.11 Functions for Key Lookup
loops, infinite 17.1.2 Debugging Infinite Loops
lower case 4.8 Case Conversion in Lisp
lower-frame 28.11 Raising and Lowering Frames
lowering a frame 28.11 Raising and Lowering Frames
lsh 3.8 Bitwise Operations on Integers
lwarn 37.5.1 Warning Basics

M
M-g 21.6 Prefix Keys
M-o 21.6 Prefix Keys
M-s 21.6 Prefix Keys
M-x 20.3 Interactive Call
Maclisp 1.2 Lisp History
macro 12.1 What Is a Function?
macro argument evaluation 13.5.2 Evaluating Macro Arguments Repeatedly
macro call 13.2 Expansion of a Macro Call
macro call evaluation 9.2.6 Lisp Macro Evaluation
macro caveats 13.5 Common Problems Using Macros
macro compilation 16.2 Byte-Compilation Functions
macro descriptions 1.3.7.1 A Sample Function Description
macro expansion 13.2 Expansion of a Macro Call
macro, how to define 13.4 Defining Macros
macroexpand 13.2 Expansion of a Macro Call
macroexpand-all 13.2 Expansion of a Macro Call
macrop 13.1 A Simple Example of a Macro
macros 13 Macros
macros, at compile time 16.5 Evaluation During Compilation
magic autoload comment 15.5 Autoload
magic file names 24.11 Making Certain File Names “Magic”
magic-fallback-mode-alist 22.2.2 How Emacs Chooses a Major Mode
magic-mode-alist 22.2.2 How Emacs Chooses a Major Mode
mail-host-address 38.3 Operating System Environment
major mode 22.2 Major Modes
major mode command 22.2 Major Modes
major mode conventions 22.2.1 Major Mode Conventions
major mode hook 22.2.1 Major Mode Conventions
major mode keymap 21.7 Active Keymaps
major mode, automatic selection 22.2.2 How Emacs Chooses a Major Mode
major-mode 22.2 Major Modes
make-abbrev-table 35.1 Abbrev Tables
make-auto-save-file-name 25.2 Auto-Saving
make-backup-file-name 25.1.4 Naming Backup Files
make-backup-file-name-function 25.1.1 Making Backup Files
make-backup-files 25.1.1 Making Backup Files
make-bool-vector 6.7 Bool-vectors
make-button 37.18.3 Making Buttons
make-byte-code 16.7 Byte-Code Function Objects
make-category-set 34.8 Categories
make-category-table 34.8 Categories
make-char-table 6.6 Char-Tables
make-composed-keymap 21.5 Inheritance and Keymaps
make-directory 24.10 Creating, Copying and Deleting Directories
make-display-table 37.21.2 Display Tables
make-frame 28.1 Creating Frames
make-frame-invisible 28.10 Visibility of Frames
make-frame-on-display 28.2 Multiple Terminals
make-frame-visible 28.10 Visibility of Frames
make-frame-visible event 20.7.10 Miscellaneous System Events
make-glyph-code 37.21.4 Glyphs
make-hash-table 7.1 Creating Hash Tables
make-help-screen 23.5 Help Functions
make-indirect-buffer 26.11 Indirect Buffers
make-keymap 21.4 Creating Keymaps
make-list 5.4 Building Cons Cells and Lists
make-local-variable 11.10.2 Creating and Deleting Buffer-Local Bindings
make-marker 30.3 Functions that Create Markers
make-network-process 36.17.1 make-network-process
make-obsolete 12.11 Declaring Functions Obsolete
make-obsolete-variable 11.13 Variable Aliases
make-overlay 37.9.1 Managing Overlays
make-progress-reporter 37.4.2 Reporting Operation Progress
make-ring 6.8 Managing a Fixed-Size Ring of Objects
make-serial-process 36.19 Communicating with Serial Ports
make-sparse-keymap 21.4 Creating Keymaps
make-string 4.3 Creating Strings
make-symbol 8.3 Creating and Interning Symbols
make-symbolic-link 24.7 Changing File Names and Attributes
make-syntax-table 34.3 Syntax Table Functions
make-temp-file 24.8.5 Generating Unique File Names
make-temp-name 24.8.5 Generating Unique File Names
make-text-button 37.18.3 Making Buttons
make-translation-table 32.9 Translation of Characters
make-translation-table-from-alist 32.9 Translation of Characters
make-translation-table-from-vector 32.9 Translation of Characters
make-variable-buffer-local 11.10.2 Creating and Deleting Buffer-Local Bindings
make-vector 6.5 Functions for Vectors
makehash 7.1 Creating Hash Tables
making backup files 25.1.1 Making Backup Files
making buttons 37.18.3 Making Buttons
makunbound 11.4 When a Variable is “Void”
managing overlays 37.9.1 Managing Overlays
manipulating buttons 37.18.4 Manipulating Buttons
map-char-table 6.6 Char-Tables
map-charset-chars 32.7 Character Sets
map-keymap 21.16 Scanning Keymaps
map-y-or-n-p 19.8 Asking Multiple Y-or-N Questions
mapatoms 8.3 Creating and Interning Symbols
mapc 12.6 Mapping Functions
mapcar 12.6 Mapping Functions
mapconcat 12.6 Mapping Functions
maphash 7.2 Hash Table Access
mapping functions 12.6 Mapping Functions
margins, display 37.16.5 Displaying in the Margins
margins, filling 31.12 Margins for Filling
mark 30.7 The Mark
mark excursion 29.3 Excursions
mark ring 30.7 The Mark
mark, the 30.7 The Mark
mark-active 30.7 The Mark
mark-even-if-inactive 30.7 The Mark
mark-marker 30.7 The Mark
mark-ring 30.7 The Mark
mark-ring-max 30.7 The Mark
marker argument 20.2.2 Code Characters for interactive
marker creation 30.3 Functions that Create Markers
marker garbage collection 30.1 Overview of Markers
marker information 30.4 Information from Markers
marker input stream 18.2 Input Streams
marker output stream 18.4 Output Streams
marker relocation 30.1 Overview of Markers
marker, how to move position 30.6 Moving Marker Positions
marker-buffer 30.4 Information from Markers
marker-insertion-type 30.5 Marker Insertion Types
marker-position 30.4 Information from Markers
markerp 30.2 Predicates on Markers
markers 30 Markers
markers as numbers 30.1 Overview of Markers
markers, predicates for 30.2 Predicates on Markers
match data 33.6 The Match Data
match, customization keyword 14.4.4 Type Keywords
match-alternatives, customization keyword 14.4.2 Composite Types
match-beginning 33.6.2 Simple Match Data Access
match-data 33.6.3 Accessing the Entire Match Data
match-end 33.6.2 Simple Match Data Access
match-string 33.6.2 Simple Match Data Access
match-string-no-properties 33.6.2 Simple Match Data Access
match-substitute-replacement 33.6.1 Replacing the Text that Matched
mathematical functions 3.9 Standard Mathematical Functions
max 3.4 Comparison of Numbers
max-char 32.5 Character Codes
max-image-size 37.17.9 Showing Images
max-lisp-eval-depth 9.5 Eval
max-mini-window-height 19.14 Minibuffer Miscellany
max-specpdl-size 11.3 Local Variables
maximize-window 27.4 Resizing Windows
maximizing windows 27.4 Resizing Windows
maximum Lisp integer 3.1 Integer Basics
maximum value of character codepoint 32.5 Character Codes
md5 31.25 Checksum/Hash
MD5 checksum 31.25 Checksum/Hash
measuring resource usage 17.5 Profiling
member 5.7 Using Lists as Sets
member-ignore-case 5.7 Using Lists as Sets
membership in a list 5.7 Using Lists as Sets
memory allocation E.3 Garbage Collection
memory usage 17.5 Profiling
memory usage E.4 Memory Usage
memory-full E.3 Garbage Collection
memory-limit E.3 Garbage Collection
memory-use-counts E.3 Garbage Collection
memq 5.7 Using Lists as Sets
memql 5.7 Using Lists as Sets
menu bar 21.17.5 The Menu Bar
menu bar keymaps Appendix G Standard Keymaps
menu definition example 21.17.4 Menu Example
menu item 21.17.1 Defining Menus
menu keymaps 21.17 Menu Keymaps
menu modification 21.17.7 Modifying Menus
menu prompt string 21.17.1 Defining Menus
menu separators 21.17.1.3 Menu Separators
menu-bar prefix key 20.8.1 Key Sequence Input
menu-bar-file-menu Appendix G Standard Keymaps
menu-bar-final-items 21.17.5 The Menu Bar
menu-bar-help-menu Appendix G Standard Keymaps
menu-bar-lines frame parameter 28.3.3.4 Layout Parameters
menu-bar-options-menu Appendix G Standard Keymaps
menu-bar-tools-menu Appendix G Standard Keymaps
menu-bar-update-hook 21.17.5 The Menu Bar
menu-item 21.17.1.2 Extended Menu Items
menu-prompt-more-char 21.17.3 Menus and the Keyboard
menus, popup 28.15 Pop-Up Menus
merge-face-attribute 37.12.3 Face Attribute Functions
message 37.4.1 Displaying Messages in the Echo Area
message digest 31.25 Checksum/Hash
message, finding what causes a particular message 17.1.1 Entering the Debugger on an Error
message-box 37.4.1 Displaying Messages in the Echo Area
message-log-max 37.4.3 Logging Messages in *Messages*
message-or-box 37.4.1 Displaying Messages in the Echo Area
message-truncate-lines 37.4.4 Echo Area Customization
messages-buffer 37.4.3 Logging Messages in *Messages*
meta character key constants 21.12 Changing Key Bindings
meta character printing 23.4 Describing Characters for Help Messages
meta characters 2.3.3.4 Meta-Character Syntax
meta characters lookup 21.3 Format of Keymaps
meta-prefix-char 21.11 Functions for Key Lookup
min 3.4 Comparison of Numbers
minibuffer 19 Minibuffers
minibuffer completion 19.6.2 Completion and the Minibuffer
minibuffer contents, accessing 19.12 Minibuffer Contents
minibuffer history 19.4 Minibuffer History
minibuffer input 20.13 Recursive Editing
minibuffer input, and command-line arguments 36.2 Shell Arguments
minibuffer input, reading lisp objects 19.3 Reading Lisp Objects with the Minibuffer
minibuffer input, reading text strings 19.2 Reading Text Strings with the Minibuffer
minibuffer window, and next-window 27.9 Cyclic Ordering of Windows
minibuffer windows 19.11 Minibuffer Windows
minibuffer, a frame parameter 28.3.3.5 Buffer Parameters
minibuffer-allow-text-properties 19.2 Reading Text Strings with the Minibuffer
minibuffer-auto-raise 28.11 Raising and Lowering Frames
minibuffer-complete 19.6.3 Minibuffer Commands that Do Completion
minibuffer-complete-and-exit 19.6.3 Minibuffer Commands that Do Completion
minibuffer-complete-word 19.6.3 Minibuffer Commands that Do Completion
minibuffer-completion-confirm 19.6.3 Minibuffer Commands that Do Completion
minibuffer-completion-help 19.6.3 Minibuffer Commands that Do Completion
minibuffer-completion-predicate 19.6.3 Minibuffer Commands that Do Completion
minibuffer-completion-table 19.6.3 Minibuffer Commands that Do Completion
minibuffer-confirm-exit-commands 19.6.3 Minibuffer Commands that Do Completion
minibuffer-contents 19.12 Minibuffer Contents
minibuffer-contents-no-properties 19.12 Minibuffer Contents
minibuffer-depth 19.13 Recursive Minibuffers
minibuffer-exit-hook 19.14 Minibuffer Miscellany
minibuffer-frame-alist 28.3.2 Initial Frame Parameters
minibuffer-help-form 19.14 Minibuffer Miscellany
minibuffer-history 19.4 Minibuffer History
minibuffer-inactive-mode 19.14 Minibuffer Miscellany
minibuffer-local-completion-map 19.6.3 Minibuffer Commands that Do Completion
minibuffer-local-filename-completion-map 19.6.3 Minibuffer Commands that Do Completion
minibuffer-local-map 19.2 Reading Text Strings with the Minibuffer
minibuffer-local-must-match-map 19.6.3 Minibuffer Commands that Do Completion
minibuffer-local-ns-map 19.2 Reading Text Strings with the Minibuffer
minibuffer-local-shell-command-map 19.6.5 Reading File Names
minibuffer-message 19.14 Minibuffer Miscellany
minibuffer-message-timeout 19.14 Minibuffer Miscellany
minibuffer-only frame 28.3.2 Initial Frame Parameters
minibuffer-prompt 19.12 Minibuffer Contents
minibuffer-prompt-end 19.12 Minibuffer Contents
minibuffer-prompt-width 19.12 Minibuffer Contents
minibuffer-scroll-window 19.14 Minibuffer Miscellany
minibuffer-selected-window 19.14 Minibuffer Miscellany
minibuffer-setup-hook 19.14 Minibuffer Miscellany
minibuffer-window 19.11 Minibuffer Windows
minibuffer-window-active-p 19.11 Minibuffer Windows
minibufferp 19.14 Minibuffer Miscellany
minimize-window 27.4 Resizing Windows
minimized frame 28.10 Visibility of Frames
minimizing windows 27.4 Resizing Windows
minimum Lisp integer 3.1 Integer Basics
minor mode 22.3 Minor Modes
minor mode conventions 22.3.1 Conventions for Writing Minor Modes
minor-mode-alist 22.4.4 Variables Used in the Mode Line
minor-mode-key-binding 21.11 Functions for Key Lookup
minor-mode-list 22.3 Minor Modes
minor-mode-map-alist 21.9 Controlling the Active Keymaps
minor-mode-overriding-map-alist 21.9 Controlling the Active Keymaps
mirroring of characters 32.6 Character Properties
misc-objects-consed E.4 Memory Usage
mkdir 24.10 Creating, Copying and Deleting Directories
mod 3.6 Arithmetic Operations
mode 22 Major and Minor Modes
mode bits 24.6.1 Testing Accessibility
mode help 22.2.3 Getting Help about a Major Mode
mode hook 22.2.1 Major Mode Conventions
mode line 22.4 Mode Line Format
mode line construct 22.4.2 The Data Structure of the Mode Line
mode loading 22.2.1 Major Mode Conventions
mode variable 22.3.1 Conventions for Writing Minor Modes
mode-class (property) 22.2.1 Major Mode Conventions
mode-line prefix key 20.8.1 Key Sequence Input
mode-line-buffer-identification 22.4.4 Variables Used in the Mode Line
mode-line-client 22.4.4 Variables Used in the Mode Line
mode-line-coding-system-map Appendix G Standard Keymaps
mode-line-column-line-number-mode-map Appendix G Standard Keymaps
mode-line-format 22.4.3 The Top Level of Mode Line Control
mode-line-frame-identification 22.4.4 Variables Used in the Mode Line
mode-line-input-method-map Appendix G Standard Keymaps
mode-line-modes 22.4.4 Variables Used in the Mode Line
mode-line-modified 22.4.4 Variables Used in the Mode Line
mode-line-mule-info 22.4.4 Variables Used in the Mode Line
mode-line-position 22.4.4 Variables Used in the Mode Line
mode-line-process 22.4.4 Variables Used in the Mode Line
mode-line-remote 22.4.4 Variables Used in the Mode Line
mode-name 22.4.4 Variables Used in the Mode Line
mode-specific-map 21.6 Prefix Keys
model/view/controller 37.19 Abstract Display
modification flag (of buffer) 26.5 Buffer Modification
modification of lists 5.6.3 Functions that Rearrange Lists
modification time of buffer 26.6 Buffer Modification Time
modification time of file 24.6.4 File Attributes
modification-hooks (overlay property) 37.9.2 Overlay Properties
modification-hooks (text property) 31.19.4 Properties with Special Meanings
modifier bits (of input character) 20.7.1 Keyboard Events
modifiers of events 20.8.3 Modifying and Translating Input Events
modify a list 5.5 Modifying List Variables
modify-all-frames-parameters 28.3.1 Access to Frame Parameters
modify-category-entry 34.8 Categories
modify-frame-parameters 28.3.1 Access to Frame Parameters
modify-syntax-entry 34.3 Syntax Table Functions
modifying strings 4.4 Modifying Strings
modulus 3.6 Arithmetic Operations
momentary-string-display 37.8 Temporary Displays
most recently selected windows 27.8 Selecting Windows
most-negative-fixnum 3.1 Integer Basics
most-positive-fixnum 3.1 Integer Basics
motion based on parsing 34.6.1 Motion Commands Based on Parsing
motion by chars, words, lines, lists 29.2 Motion
motion event 20.7.8 Motion Events
mouse click event 20.7.4 Click Events
mouse drag event 20.7.5 Drag Events
mouse events, data in 20.7.13 Accessing Mouse Events
mouse events, in special parts of frame 20.8.1 Key Sequence Input
mouse events, repeated 20.7.7 Repeat Events
mouse motion events 20.7.8 Motion Events
mouse pointer shape 28.17 Pointer Shape
mouse position 28.14 Mouse Position
mouse position list 20.7.4 Click Events
mouse position list, accessing 20.7.13 Accessing Mouse Events
mouse tracking 28.13 Mouse Tracking
mouse, availability 28.23 Display Feature Testing
mouse-1 31.19.8 Defining Clickable Text
mouse-1-click-follows-link 31.19.8 Defining Clickable Text
mouse-2 D.2 Key Binding Conventions
mouse-action (button property) 37.18.1 Button Properties
mouse-appearance-menu-map Appendix G Standard Keymaps
mouse-color, a frame parameter 28.3.3.8 Font and Color Parameters
mouse-face (button property) 37.18.1 Button Properties
mouse-face (overlay property) 37.9.2 Overlay Properties
mouse-face (text property) 31.19.4 Properties with Special Meanings
mouse-leave-buffer-hook Appendix H Standard Hooks
mouse-movement-p 20.7.12 Classifying Events
mouse-on-link-p 31.19.8 Defining Clickable Text
mouse-pixel-position 28.14 Mouse Position
mouse-position 28.14 Mouse Position
mouse-position-function 28.14 Mouse Position
mouse-wheel-down-event 20.7.10 Miscellaneous System Events
mouse-wheel-up-event 20.7.10 Miscellaneous System Events
move to beginning or end of buffer 29.2.3 Motion to an End of the Buffer
move-marker 30.6 Moving Marker Positions
move-overlay 37.9.1 Managing Overlays
move-point-visually 37.24 Bidirectional Display
move-to-column 31.16 Counting Columns
move-to-left-margin 31.12 Margins for Filling
move-to-window-line 29.2.5 Motion by Screen Lines
movemail 36.1 Functions that Create Subprocesses
moving across syntax classes 34.5 Motion and Syntax
moving markers 30.6 Moving Marker Positions
MS-DOS and file modes 24.6.1 Testing Accessibility
MS-Windows file-name syntax 24.8 File Names
mule-keymap 21.6 Prefix Keys
multi-file package 39.3 Multi-file Packages
multi-frame images 37.17.10 Multi-Frame Images
multi-monitor 28.2 Multiple Terminals
multi-query-replace-map 33.7 Search and Replace
multi-tty 28.2 Multiple Terminals
multibyte characters 32 Non-ASCII Characters
multibyte text 32.1 Text Representations
multibyte-char-to-unibyte 32.3 Converting Text Representations
multibyte-string-p 32.1 Text Representations
multibyte-syntax-as-symbol 34.6.5 Parameters to Control Parsing
multiline font lock 22.6.9 Multiline Font Lock Constructs
multiple terminals 28.2 Multiple Terminals
multiple windows 27.1 Basic Concepts of Emacs Windows
multiple X displays 28.2 Multiple Terminals
multiple yes-or-no questions 19.8 Asking Multiple Y-or-N Questions
multiple-frames 28.5 Frame Titles

N
name, a frame parameter 28.3.3.1 Basic Parameters
named function 12.3 Naming a Function
naming backup files 25.1.4 Naming Backup Files
NaN 3.2 Floating-Point Basics
narrow-map Appendix G Standard Keymaps
narrow-to-page 29.4 Narrowing
narrow-to-region 29.4 Narrowing
narrowing 29.4 Narrowing
natnump 3.3 Type Predicates for Numbers
natural numbers 3.3 Type Predicates for Numbers
nbutlast 5.3 Accessing Elements of Lists
nconc 5.6.3 Functions that Rearrange Lists
negative infinity 3.2 Floating-Point Basics
negative-argument 20.12 Prefix Command Arguments
network byte ordering 36.20.1 Describing Data Layout
network connection 36.14 Network Connections
network connection, encrypted 36.14 Network Connections
network servers 36.15 Network Servers
network service name, and default coding system 32.10.5 Default Coding Systems
network-coding-system-alist 32.10.5 Default Coding Systems
network-interface-info 36.18 Misc Network Facilities
network-interface-list 36.18 Misc Network Facilities
new file message 24.1.2 Subroutines of Visiting
newline 2.3.3.1 Basic Char Syntax
newline 31.5 User-Level Insertion Commands
newline and Auto Fill mode 31.5 User-Level Insertion Commands
newline in print 18.5 Output Functions
newline in strings 2.3.8.1 Syntax for Strings
newline-and-indent 31.17.2 Indentation Controlled by Major Mode
next input 20.8.6 Miscellaneous Event Input Features
next-button 37.18.5 Button Buffer Commands
next-char-property-change 31.19.3 Text Property Search Functions
next-complete-history-element 19.10 Minibuffer Commands
next-frame 28.7 Finding All Frames
next-history-element 19.10 Minibuffer Commands
next-matching-history-element 19.10 Minibuffer Commands
next-overlay-change 37.9.3 Searching for Overlays
next-property-change 31.19.3 Text Property Search Functions
next-screen-context-lines 27.20 Textual Scrolling
next-single-char-property-change 31.19.3 Text Property Search Functions
next-single-property-change 31.19.3 Text Property Search Functions
next-window 27.9 Cyclic Ordering of Windows
nil 1.3.2 nil and t
nil as a list 2.3.6.1 Drawing Lists as Box Diagrams
nil in keymap 21.10 Key Lookup
nil input stream 18.2 Input Streams
nil output stream 18.4 Output Streams
nlistp 5.2 Predicates on Lists
no-byte-compile 16 Byte Compilation
no-catch 10.5.1 Explicit Nonlocal Exits: catch and throw
no-conversion coding system 32.10.1 Basic Concepts of Coding Systems
no-redraw-on-reenter 37.1 Refreshing the Screen
no-self-insert property 35.2 Defining Abbrevs
node, ewoc 37.19 Abstract Display
non-ASCII characters 32 Non-ASCII Characters
non-ASCII characters in loaded files 15.4 Loading Non-ASCII Characters
non-ASCII text in keybindings 21.15 Commands for Binding Keys
non-capturing group 33.3.1.3 Backslash Constructs in Regular Expressions
non-greedy repetition characters in regexp 33.3.1.1 Special Characters in Regular Expressions
nondirectory part (of file name) 24.8.1 File Name Components
noninteractive 38.16 Batch Mode
nonlocal exits 10.5 Nonlocal Exits
nonlocal exits, cleaning up 10.5.4 Cleaning Up from Nonlocal Exits
nonprinting characters, reading 20.8.5 Quoted Character Input
noreturn 17.4 Test Coverage
normal hook 22.1 Hooks
normal-auto-fill-function 31.14 Auto Filling
normal-backup-enable-predicate 25.1.1 Making Backup Files
normal-mode 22.2.2 How Emacs Chooses a Major Mode
not 10.3 Constructs for Combining Conditions
not-modified 26.5 Buffer Modification
notation 1.3.3 Evaluation Notation
notifications, on desktop 38.18 Desktop Notifications
notifications-close-notification 38.18 Desktop Notifications
notifications-get-capabilities 38.18 Desktop Notifications
notifications-get-server-information 38.18 Desktop Notifications
notifications-notify 38.18 Desktop Notifications
nreverse 5.6.3 Functions that Rearrange Lists
nth 5.3 Accessing Elements of Lists
nthcdr 5.3 Accessing Elements of Lists
null 5.2 Predicates on Lists
null bytes, and decoding text 32.10.3 Coding Systems in Lisp
num-input-keys 20.8.1 Key Sequence Input
num-nonmacro-input-events 20.8.2 Reading One Event
number comparison 3.4 Comparison of Numbers
number conversions 3.5 Numeric Conversions
number-or-marker-p 30.2 Predicates on Markers
number-sequence 5.4 Building Cons Cells and Lists
number-to-string 4.6 Conversion of Characters and Strings
numbered backups 25.1.3 Making and Deleting Numbered Backup Files
numberp 3.3 Type Predicates for Numbers
numbers 3 Numbers
numeric prefix argument 20.12 Prefix Command Arguments
numeric prefix argument usage 20.2.2 Code Characters for interactive
numerical RGB color specification 28.20 Color Names

O
obarray 8.3 Creating and Interning Symbols
obarray 8.3 Creating and Interning Symbols
obarray in completion 19.6.1 Basic Completion Functions
object 2 Lisp Data Types
object internals E.7 Object Internals
object to string 18.5 Output Functions
obsolete functions 12.11 Declaring Functions Obsolete
octal character code 2.3.3.2 General Escape Syntax
octal character input 20.8.5 Quoted Character Input
octal escapes 37.21.1 Usual Display Conventions
octal numbers 3.1 Integer Basics
old advices, porting 12.10.4 Adapting code using the old defadvice
one-window-p 27.9 Cyclic Ordering of Windows
only-global-abbrevs 35.2 Defining Abbrevs
opacity, frame 28.3.3.8 Font and Color Parameters
open-dribble-file 38.12.2 Recording Input
open-network-stream 36.14 Network Connections
open-paren-in-column-0-is-defun-start 29.2.6 Moving over Balanced Expressions
open-termscript 38.13 Terminal Output
OpenType font 37.12.12 Low-Level Font Representation
operating system environment 38.3 Operating System Environment
operating system signal 38.2.1 Killing Emacs
operations (property) 24.11 Making Certain File Names “Magic”
optimize regexp 33.3.3 Regular Expression Functions
option descriptions 1.3.7.2 A Sample Variable Description
optional arguments 12.2.3 Other Features of Argument Lists
options on command line 38.1.4 Command-Line Arguments
options, defcustom keyword 14.3 Defining Customization Variables
or 10.3 Constructs for Combining Conditions
ordering of windows, cyclic 27.9 Cyclic Ordering of Windows
other-buffer 26.8 The Buffer List
other-window 27.9 Cyclic Ordering of Windows
other-window-scroll-buffer 27.20 Textual Scrolling
outer-window-id, a frame parameter 28.3.3.6 Window Management Parameters
output from processes 36.9 Receiving Output from Processes
output stream 18.4 Output Streams
output-controlling variables 18.6 Variables Affecting Output
overall prompt string 21.3 Format of Keymaps
overflow 3.1 Integer Basics
overflow-newline-into-fringe 37.13.3 Fringe Cursors
overlay properties 37.9.2 Overlay Properties
overlay-arrow-position 37.13.6 The Overlay Arrow
overlay-arrow-string 37.13.6 The Overlay Arrow
overlay-arrow-variable-list 37.13.6 The Overlay Arrow
overlay-buffer 37.9.1 Managing Overlays
overlay-end 37.9.1 Managing Overlays
overlay-get 37.9.2 Overlay Properties
overlay-properties 37.9.2 Overlay Properties
overlay-put 37.9.2 Overlay Properties
overlay-recenter 37.9.1 Managing Overlays
overlay-start 37.9.1 Managing Overlays
overlayp 37.9.1 Managing Overlays
overlays 37.9 Overlays
overlays, managing 37.9.1 Managing Overlays
overlays, searching for 37.9.3 Searching for Overlays
overlays-at 37.9.3 Searching for Overlays
overlays-in 37.9.3 Searching for Overlays
overlined text 37.12.1 Face Attributes
override spec (for a face) 37.12.2 Defining Faces
overriding-local-map 21.9 Controlling the Active Keymaps
overriding-local-map-menu-flag 21.9 Controlling the Active Keymaps
overriding-terminal-local-map 21.9 Controlling the Active Keymaps
overwrite-mode 31.5 User-Level Insertion Commands

P
package 39 Preparing Lisp code for distribution
package archive 39.4 Creating and Maintaining Package Archives
package archive security 39.4 Creating and Maintaining Package Archives
package attributes 39.1 Packaging Basics
package autoloads 39.1 Packaging Basics
package dependencies 39.1 Packaging Basics
package name 39.1 Packaging Basics
package signing 39.4 Creating and Maintaining Package Archives
package version 39.1 Packaging Basics
package-archive-upload-base 39.4 Creating and Maintaining Package Archives
package-archives 39.4 Creating and Maintaining Package Archives
package-initialize 39.1 Packaging Basics
package-upload-buffer 39.4 Creating and Maintaining Package Archives
package-upload-file 39.4 Creating and Maintaining Package Archives
package-version, customization keyword 14.1 Common Item Keywords
packing 36.20 Packing and Unpacking Byte Arrays
padding 4.7 Formatting Strings
page-delimiter 33.8 Standard Regular Expressions Used in Editing
paragraph-separate 33.8 Standard Regular Expressions Used in Editing
paragraph-start 33.8 Standard Regular Expressions Used in Editing
parameters of initial frame 28.3.2 Initial Frame Parameters
parent of char-table 6.6 Char-Tables
parent process 36 Processes
parent window 27.2 Windows and Frames
parent window 27.2 Windows and Frames
parenthesis 2.3.6 Cons Cell and List Types
parenthesis depth 34.6.4 Low-Level Parsing
parenthesis matching 37.20 Blinking Parentheses
parenthesis mismatch, debugging 17.3 Debugging Invalid Lisp Syntax
parity, in serial connections 36.19 Communicating with Serial Ports
parse state for a position 34.6.2 Finding the Parse State for a Position
parse-colon-path 38.3 Operating System Environment
parse-partial-sexp 34.6.4 Low-Level Parsing
parse-sexp-ignore-comments 34.6.5 Parameters to Control Parsing
parse-sexp-lookup-properties 34.4 Syntax Properties
parse-sexp-lookup-properties 34.6.5 Parameters to Control Parsing
parser state 34.6.3 Parser State
parsing buffer text 34 Syntax Tables
parsing expressions 34.6 Parsing Expressions
parsing html 31.26 Parsing HTML and XML
parsing xml 31.26 Parsing HTML and XML
parsing, control parameters 34.6.5 Parameters to Control Parsing
partial application of functions 12.5 Calling Functions
partial-width windows 37.3 Truncation
passwords, reading 19.9 Reading a Password
PATH environment variable 36.1 Functions that Create Subprocesses
path-separator 38.3 Operating System Environment
pattern matching 10.2.1 Pattern matching case statement
PBM 37.17.7 Other Image Types
pcase 10.2.1 Pattern matching case statement
peculiar error 10.5.3.4 Error Symbols and Condition Names
peeking at input 20.8.6 Miscellaneous Event Input Features
percent symbol in mode line 22.4.2 The Data Structure of the Mode Line
perform-replace 33.7 Search and Replace
performance analysis 17.2.13 Coverage Testing
permanent local variable 11.10.2 Creating and Deleting Buffer-Local Bindings
permissions, file 24.6.1 Testing Accessibility
permissions, file 24.7 Changing File Names and Attributes
piece of advice 12.10 Advising Emacs Lisp Functions
pipe 36.4 Creating an Asynchronous Process
pixel height of a window 27.3 Window Sizes
pixel height of a window 27.3 Window Sizes
pixelwise, resizing windows 27.4 Resizing Windows
place form 11.15 Generalized Variables
play-sound 38.14 Sound Output
play-sound-file 38.14 Sound Output
play-sound-functions 38.14 Sound Output
plist 5.9 Property Lists
plist access 5.9.2 Property Lists Outside Symbols
plist vs. alist 5.9.1 Property Lists and Association Lists
plist-get 5.9.2 Property Lists Outside Symbols
plist-member 5.9.2 Property Lists Outside Symbols
plist-put 5.9.2 Property Lists Outside Symbols
point 29.1 Point
point 29.1 Point
point excursion 29.3 Excursions
point in window 27.18 Windows and Point
point with narrowing 29.1 Point
point-entered (text property) 31.19.4 Properties with Special Meanings
point-left (text property) 31.19.4 Properties with Special Meanings
point-marker 30.3 Functions that Create Markers
point-max 29.1 Point
point-max-marker 30.3 Functions that Create Markers
point-min 29.1 Point
point-min-marker 30.3 Functions that Create Markers
pointer (text property) 31.19.4 Properties with Special Meanings
pointer shape 28.17 Pointer Shape
pointers 2.3.6 Cons Cell and List Types
pop 5.3 Accessing Elements of Lists
pop-mark 30.7 The Mark
pop-to-buffer 27.11 Switching to a Buffer in a Window
pop-up-frame-alist 27.14 Additional Options for Displaying Buffers
pop-up-frame-function 27.14 Additional Options for Displaying Buffers
pop-up-frames 27.14 Additional Options for Displaying Buffers
pop-up-windows 27.14 Additional Options for Displaying Buffers
port number, and default coding system 32.10.5 Default Coding Systems
pos-visible-in-window-p 27.19 The Window Start and End Positions
position (in buffer) 29 Positions
position argument 20.2.2 Code Characters for interactive
position in window 27.18 Windows and Point
position of mouse 28.14 Mouse Position
position-bytes 32.1 Text Representations
positive infinity 3.2 Floating-Point Basics
posix-looking-at 33.5 POSIX Regular Expression Searching
posix-search-backward 33.5 POSIX Regular Expression Searching
posix-search-forward 33.5 POSIX Regular Expression Searching
posix-string-match 33.5 POSIX Regular Expression Searching
posn-actual-col-row 20.7.13 Accessing Mouse Events
posn-area 20.7.13 Accessing Mouse Events
posn-at-point 20.7.13 Accessing Mouse Events
posn-at-x-y 20.7.13 Accessing Mouse Events
posn-col-row 20.7.13 Accessing Mouse Events
posn-image 20.7.13 Accessing Mouse Events
posn-object 20.7.13 Accessing Mouse Events
posn-object-width-height 20.7.13 Accessing Mouse Events
posn-object-x-y 20.7.13 Accessing Mouse Events
posn-point 20.7.13 Accessing Mouse Events
posn-string 20.7.13 Accessing Mouse Events
posn-timestamp 20.7.13 Accessing Mouse Events
posn-window 20.7.13 Accessing Mouse Events
posn-x-y 20.7.13 Accessing Mouse Events
posnp 20.7.13 Accessing Mouse Events
post-command-hook 20.1 Command Loop Overview
post-gc-hook E.3 Garbage Collection
post-self-insert-hook 31.5 User-Level Insertion Commands
postscript images 37.17.5 PostScript Images
pp 18.5 Output Functions
pre-command-hook 20.1 Command Loop Overview
pre-redisplay-function 37.2 Forcing Redisplay
preceding-char 31.1 Examining Text Near Point
precision in format specifications 4.7 Formatting Strings
predicates for lists 5.2 Predicates on Lists
predicates for markers 30.2 Predicates on Markers
predicates for numbers 3.3 Type Predicates for Numbers
predicates for strings 4.2 Predicates for Strings
prefix argument 20.12 Prefix Command Arguments
prefix argument unreading 20.8.6 Miscellaneous Event Input Features
prefix command 21.6 Prefix Keys
prefix key 21.6 Prefix Keys
prefix, defgroup keyword 14.2 Defining Customization Groups
prefix-arg 20.12 Prefix Command Arguments
prefix-help-command 23.5 Help Functions
prefix-numeric-value 20.12 Prefix Command Arguments
preloaded Lisp files E.1 Building Emacs
preloaded-file-list E.1 Building Emacs
preloading additional functions and variables E.1 Building Emacs
prepare-change-group 31.27 Atomic Change Groups
preventing backtracking 17.2.15.2 Specification List
preventing prefix key 21.10 Key Lookup
preventing quitting 20.11 Quitting
previous complete subexpression 34.6.3 Parser State
previous-button 37.18.5 Button Buffer Commands
previous-char-property-change 31.19.3 Text Property Search Functions
previous-complete-history-element 19.10 Minibuffer Commands
previous-frame 28.7 Finding All Frames
previous-history-element 19.10 Minibuffer Commands
previous-matching-history-element 19.10 Minibuffer Commands
previous-overlay-change 37.9.3 Searching for Overlays
previous-property-change 31.19.3 Text Property Search Functions
previous-single-char-property-change 31.19.3 Text Property Search Functions
previous-single-property-change 31.19.3 Text Property Search Functions
previous-window 27.9 Cyclic Ordering of Windows
primary selection 28.18 Window System Selections
primitive 12.1 What Is a Function?
primitive function 2.3.15 Primitive Function Type
primitive function internals E.6 Writing Emacs Primitives
primitive type 2 Lisp Data Types
primitive-undo 31.9 Undo
prin1 18.5 Output Functions
prin1-to-string 18.5 Output Functions
princ 18.5 Output Functions
print 18.5 Output Functions
print example 18.4 Output Streams
print name cell 8.1 Symbol Components
print-circle 18.6 Variables Affecting Output
print-continuous-numbering 18.6 Variables Affecting Output
print-escape-multibyte 18.6 Variables Affecting Output
print-escape-newlines 18.6 Variables Affecting Output
print-escape-nonascii 18.6 Variables Affecting Output
print-gensym 18.6 Variables Affecting Output
print-length 18.6 Variables Affecting Output
print-level 18.6 Variables Affecting Output
print-number-table 18.6 Variables Affecting Output
print-quoted 18.6 Variables Affecting Output
printable ASCII characters 37.21.1 Usual Display Conventions
printable-chars 32.6 Character Properties
printed representation 2.1 Printed Representation and Read Syntax
printed representation for characters 2.3.3.1 Basic Char Syntax
printing 18.1 Introduction to Reading and Printing
printing (Edebug) 17.2.11 Printing in Edebug
printing circular structures 17.2.11 Printing in Edebug
printing limits 18.6 Variables Affecting Output
printing notation 1.3.4 Printing Notation
priority (overlay property) 37.9.2 Overlay Properties
priority order of coding systems 32.10.6 Specifying a Coding System for One Operation
process 36 Processes
process creation 36.1 Functions that Create Subprocesses
process filter 36.9.2 Process Filter Functions
process filter multibyte flag 36.9.3 Decoding Process Output
process information 36.6 Process Information
process input 36.7 Sending Input to Processes
process internals E.7.3 Process Internals
process output 36.9 Receiving Output from Processes
process sentinel 36.10 Sentinels: Detecting Process Status Changes
process signals 36.8 Sending Signals to Processes
process-adaptive-read-buffering 36.9 Receiving Output from Processes
process-attributes 36.12 Accessing Other Processes
process-buffer 36.9.1 Process Buffers
process-coding-system 36.6 Process Information
process-coding-system-alist 32.10.5 Default Coding Systems
process-command 36.6 Process Information
process-connection-type 36.4 Creating an Asynchronous Process
process-contact 36.6 Process Information
process-datagram-address 36.16 Datagrams
process-environment 38.3 Operating System Environment
process-exit-status 36.6 Process Information
process-file 36.3 Creating a Synchronous Process
process-file-shell-command 36.3 Creating a Synchronous Process
process-file-side-effects 36.3 Creating a Synchronous Process
process-filter 36.9.2 Process Filter Functions
process-get 36.6 Process Information
process-id 36.6 Process Information
process-kill-buffer-query-function 36.9.1 Process Buffers
process-lines 36.3 Creating a Synchronous Process
process-list 36.6 Process Information
process-live-p 36.6 Process Information
process-mark 36.9.1 Process Buffers
process-name 36.6 Process Information
process-plist 36.6 Process Information
process-put 36.6 Process Information
process-query-on-exit-flag 36.11 Querying Before Exit
process-running-child-p 36.7 Sending Input to Processes
process-send-eof 36.7 Sending Input to Processes
process-send-region 36.7 Sending Input to Processes
process-send-string 36.7 Sending Input to Processes
process-sentinel 36.10 Sentinels: Detecting Process Status Changes
process-status 36.6 Process Information
process-tty-name 36.6 Process Information
process-type 36.6 Process Information
processing of errors 10.5.3.2 How Emacs Processes Errors
processor run time 38.8 Processor Run time
processp 36 Processes
profiling 17.5 Profiling
prog-mode 22.2.5 Basic Major Modes
prog-mode, and bidi-paragraph-direction 37.24 Bidirectional Display
prog-mode-hook 22.2.5 Basic Major Modes
prog1 10.1 Sequencing
prog2 10.1 Sequencing
progn 10.1 Sequencing
program arguments 36.1 Functions that Create Subprocesses
program directories 36.1 Functions that Create Subprocesses
program name, and default coding system 32.10.5 Default Coding Systems
programmed completion 19.6.7 Programmed Completion
programming conventions D.3 Emacs Programming Tips
programming types 2.3 Programming Types
progress reporting 37.4.2 Reporting Operation Progress
progress-reporter-done 37.4.2 Reporting Operation Progress
progress-reporter-force-update 37.4.2 Reporting Operation Progress
progress-reporter-update 37.4.2 Reporting Operation Progress
prompt for file name 19.6.5 Reading File Names
prompt string (of menu) 21.17.1 Defining Menus
prompt string of keymap 21.3 Format of Keymaps
properties of text 31.19 Text Properties
propertize 31.19.2 Changing Text Properties
property category of text character 31.19.4 Properties with Special Meanings
property list 5.9 Property Lists
property list cell 8.1 Symbol Components
property lists vs association lists 5.9.1 Property Lists and Association Lists
protect C variables from garbage collection E.6 Writing Emacs Primitives
protected forms 10.5.4 Cleaning Up from Nonlocal Exits
provide 15.7 Features
provide-theme 14.6 Custom Themes
providing features 15.7 Features
pty 36.4 Creating an Asynchronous Process
pure storage E.2 Pure Storage
pure-bytes-used E.2 Pure Storage
purecopy E.2 Pure Storage
purify-flag E.2 Pure Storage
push 5.5 Modifying List Variables
push-button 37.18.5 Button Buffer Commands
push-mark 30.7 The Mark
put 8.4.1 Accessing Symbol Properties
put-char-code-property 32.6 Character Properties
put-charset-property 32.7 Character Sets
put-image 37.17.9 Showing Images
put-text-property 31.19.2 Changing Text Properties
puthash 7.2 Hash Table Access

Q
query-replace-history 19.4 Minibuffer History
query-replace-map 33.7 Search and Replace
querying the user 19.7 Yes-or-No Queries
question mark in character constant 2.3.3.1 Basic Char Syntax
quietly-read-abbrev-file 35.3 Saving Abbrevs in Files
quit-flag 20.11 Quitting
quit-process 36.8 Sending Signals to Processes
quit-restore-window 27.17 Quitting Windows
quit-window 27.17 Quitting Windows
quitting 20.11 Quitting
quitting from infinite loop 17.1.2 Debugging Infinite Loops
quote 9.3 Quoting
quote character 34.6.3 Parser State
quote special characters in regexp 33.3.3 Regular Expression Functions
quoted character input 20.8.5 Quoted Character Input
quoted-insert suppression 21.12 Changing Key Bindings
quoting and unquoting command-line arguments 36.2 Shell Arguments
quoting characters in printing 18.5 Output Functions
quoting using apostrophe 9.3 Quoting

R
radix for reading an integer 3.1 Integer Basics
raise-frame 28.11 Raising and Lowering Frames
raising a frame 28.11 Raising and Lowering Frames
random 3.10 Random Numbers
random numbers 3.10 Random Numbers
rassoc 5.8 Association Lists
rassq 5.8 Association Lists
rassq-delete-all 5.8 Association Lists
raw prefix argument 20.12 Prefix Command Arguments
raw prefix argument usage 20.2.2 Code Characters for interactive
raw syntax descriptor 34.7 Syntax Table Internals
raw-text coding system 32.10.1 Basic Concepts of Coding Systems
re-builder 33.3 Regular Expressions
re-search-backward 33.4 Regular Expression Searching
re-search-forward 33.4 Regular Expression Searching
read 18.3 Input Functions
read command name 20.3 Interactive Call
read file names 19.6.5 Reading File Names
read input 20.8 Reading Input
read syntax 2.1 Printed Representation and Read Syntax
read syntax for characters 2.3.3.1 Basic Char Syntax
read-buffer 19.6.4 High-Level Completion Functions
read-buffer-completion-ignore-case 19.6.4 High-Level Completion Functions
read-buffer-function 19.6.4 High-Level Completion Functions
read-char 20.8.2 Reading One Event
read-char-choice 20.8.2 Reading One Event
read-char-exclusive 20.8.2 Reading One Event
read-circle 18.3 Input Functions
read-coding-system 32.10.4 User-Chosen Coding Systems
read-color 19.6.4 High-Level Completion Functions
read-command 19.6.4 High-Level Completion Functions
read-directory-name 19.6.5 Reading File Names
read-event 20.8.2 Reading One Event
read-expression-history 19.4 Minibuffer History
read-file-modes 24.7 Changing File Names and Attributes
read-file-name 19.6.5 Reading File Names
read-file-name-completion-ignore-case 19.6.5 Reading File Names
read-file-name-function 19.6.5 Reading File Names
read-from-minibuffer 19.2 Reading Text Strings with the Minibuffer
read-from-string 18.3 Input Functions
read-input-method-name 32.11 Input Methods
read-kbd-macro 23.4 Describing Characters for Help Messages
read-key 20.8.2 Reading One Event
read-key-sequence 20.8.1 Key Sequence Input
read-key-sequence-vector 20.8.1 Key Sequence Input
read-minibuffer 19.3 Reading Lisp Objects with the Minibuffer
read-no-blanks-input 19.2 Reading Text Strings with the Minibuffer
read-non-nil-coding-system 32.10.4 User-Chosen Coding Systems
read-only (text property) 31.19.4 Properties with Special Meanings
read-only buffer 26.7 Read-Only Buffers
read-only buffers in interactive 20.2.1 Using interactive
read-only character 31.19.4 Properties with Special Meanings
read-only-mode 26.7 Read-Only Buffers
read-passwd 19.9 Reading a Password
read-quoted-char 20.8.5 Quoted Character Input
read-quoted-char quitting 20.11 Quitting
read-regexp 19.2 Reading Text Strings with the Minibuffer
read-regexp-defaults-function 19.2 Reading Text Strings with the Minibuffer
read-shell-command 19.6.5 Reading File Names
read-string 19.2 Reading Text Strings with the Minibuffer
read-variable 19.6.4 High-Level Completion Functions
reading 18.1 Introduction to Reading and Printing
reading a single event 20.8.2 Reading One Event
reading from files 24.3 Reading from Files
reading from minibuffer with completion 19.6.2 Completion and the Minibuffer
reading interactive arguments 20.2.2 Code Characters for interactive
reading numbers in hex, octal, and binary 3.1 Integer Basics
reading order 37.24 Bidirectional Display
reading symbols 8.3 Creating and Interning Symbols
real-last-command 20.5 Information from the Command Loop
rearrangement of lists 5.6.3 Functions that Rearrange Lists
rebinding 21.12 Changing Key Bindings
recent-auto-save-p 25.2 Auto-Saving
recent-keys 38.12.2 Recording Input
recenter 27.20 Textual Scrolling
recenter-positions 27.20 Textual Scrolling
recenter-redisplay 27.20 Textual Scrolling
recenter-top-bottom 27.20 Textual Scrolling
recombining windows 27.7 Recombining Windows
record command history 20.3 Interactive Call
recording input 38.12.2 Recording Input
recursion 10.4 Iteration
recursion-depth 20.13 Recursive Editing
recursive command loop 20.13 Recursive Editing
recursive editing level 20.13 Recursive Editing
recursive evaluation 9.1 Introduction to Evaluation
recursive minibuffers 19.13 Recursive Minibuffers
recursive-edit 20.13 Recursive Editing
redirect-frame-focus 28.9 Input Focus
redisplay 37.2 Forcing Redisplay
redo 31.9 Undo
redraw-display 37.1 Refreshing the Screen
redraw-frame 37.1 Refreshing the Screen
references, following D.2 Key Binding Conventions
refresh the screen 37.1 Refreshing the Screen
regexp 33.3 Regular Expressions
regexp alternative 33.3.1.3 Backslash Constructs in Regular Expressions
regexp grouping 33.3.1.3 Backslash Constructs in Regular Expressions
regexp searching 33.4 Regular Expression Searching
regexp syntax 33.3.1 Syntax of Regular Expressions
regexp, special characters in 33.3.1.1 Special Characters in Regular Expressions
regexp-history 19.4 Minibuffer History
regexp-opt 33.3.3 Regular Expression Functions
regexp-opt-charset 33.3.3 Regular Expression Functions
regexp-opt-depth 33.3.3 Regular Expression Functions
regexp-quote 33.3.3 Regular Expression Functions
regexps used standardly in editing 33.8 Standard Regular Expressions Used in Editing
region 30.8 The Region
region argument 20.2.2 Code Characters for interactive
region-beginning 30.8 The Region
region-end 30.8 The Region
register preview 31.21 Registers
register-alist 31.21 Registers
register-read-with-preview 31.21 Registers
registers 31.21 Registers
regular expression 33.3 Regular Expressions
regular expression searching 33.4 Regular Expression Searching
regular expressions, developing 33.3 Regular Expressions
reindent-then-newline-and-indent 31.17.2 Indentation Controlled by Major Mode
relative file name 24.8.2 Absolute and Relative File Names
relative remapping, faces 37.12.5 Face Remapping
remainder 3.6 Arithmetic Operations
remapping commands 21.13 Remapping Commands
remhash 7.2 Hash Table Access
remote-file-name-inhibit-cache 24.11 Making Certain File Names “Magic”
remove 5.7 Using Lists as Sets
remove-from-invisibility-spec 37.6 Invisible Text
remove-function 12.10.1 Primitives to manipulate advices
remove-hook 22.1.2 Setting Hooks
remove-images 37.17.9 Showing Images
remove-list-of-text-properties 31.19.2 Changing Text Properties
remove-overlays 37.9.1 Managing Overlays
remove-text-properties 31.19.2 Changing Text Properties
remq 5.7 Using Lists as Sets
rename-auto-save-file 25.2 Auto-Saving
rename-buffer 26.3 Buffer Names
rename-file 24.7 Changing File Names and Attributes
rendering html 31.26 Parsing HTML and XML
reordering, of bidirectional text 37.24 Bidirectional Display
reordering, of elements in lists 5.6.3 Functions that Rearrange Lists
repeat events 20.7.7 Repeat Events
repeated loading 15.6 Repeated Loading
replace bindings 21.12 Changing Key Bindings
replace characters 31.20 Substituting for a Character Code
replace characters in region 31.20 Substituting for a Character Code
replace list element 5.6.1 Altering List Elements with setcar
replace matched text 33.6.1 Replacing the Text that Matched
replace part of list 5.6.2 Altering the CDR of a List
replace-buffer-in-windows 27.10 Buffers and Windows
replace-match 33.6.1 Replacing the Text that Matched
replace-re-search-function 33.7 Search and Replace
replace-regexp-in-string 33.7 Search and Replace
replace-search-function 33.7 Search and Replace
replacement after search 33.7 Search and Replace
replacing display specs 37.16.1 Display Specs That Replace The Text
require 15.7 Features
require, customization keyword 14.1 Common Item Keywords
require-final-newline 24.2 Saving Buffers
requiring features 15.7 Features
reserved keys D.2 Key Binding Conventions
resize frame 28.3.4 Frame Size And Position
resize window 27.4 Resizing Windows
rest arguments 12.2.3 Other Features of Argument Lists
restore-buffer-modified-p 26.5 Buffer Modification
restriction (in a buffer) 29.4 Narrowing
resume (cf. no-redraw-on-reenter) 37.1 Refreshing the Screen
resume-tty 38.2.2 Suspending Emacs
resume-tty-functions 38.2.2 Suspending Emacs
rethrow a signal 10.5.3.3 Writing Code to Handle Errors
return (ASCII character) 2.3.3.1 Basic Char Syntax
return value 12.1 What Is a Function?
reverse 5.4 Building Cons Cells and Lists
reversing a list 5.6.3 Functions that Rearrange Lists
revert-buffer 25.3 Reverting
revert-buffer-function 25.3 Reverting
revert-buffer-in-progress-p 25.3 Reverting
revert-buffer-insert-file-contents-function 25.3 Reverting
revert-without-query 25.3 Reverting
reverting buffers 25.3 Reverting
rgb value 28.20 Color Names
right dividers 37.15 Window Dividers
right-divider-width, a frame parameter 28.3.3.4 Layout Parameters
right-fringe, a frame parameter 28.3.3.4 Layout Parameters
right-fringe-width 37.13.1 Fringe Size and Position
right-margin-width 37.16.5 Displaying in the Margins
right-to-left text 37.24 Bidirectional Display
ring data structure 6.8 Managing a Fixed-Size Ring of Objects
ring-bell-function 37.22 Beeping
ring-copy 6.8 Managing a Fixed-Size Ring of Objects
ring-elements 6.8 Managing a Fixed-Size Ring of Objects
ring-empty-p 6.8 Managing a Fixed-Size Ring of Objects
ring-insert 6.8 Managing a Fixed-Size Ring of Objects
ring-insert-at-beginning 6.8 Managing a Fixed-Size Ring of Objects
ring-length 6.8 Managing a Fixed-Size Ring of Objects
ring-p 6.8 Managing a Fixed-Size Ring of Objects
ring-ref 6.8 Managing a Fixed-Size Ring of Objects
ring-remove 6.8 Managing a Fixed-Size Ring of Objects
ring-size 6.8 Managing a Fixed-Size Ring of Objects
risky, defcustom keyword 14.3 Defining Customization Variables
risky-local-variable-p 11.11 File Local Variables
rm 24.7 Changing File Names and Attributes
root window 27.2 Windows and Frames
round 3.5 Numeric Conversions
rounding in conversions 3.5 Numeric Conversions
rounding without conversion 3.7 Rounding Operations
rplaca 5.6 Modifying Existing List Structure
rplacd 5.6 Modifying Existing List Structure
run time stack 17.1.8 Internals of the Debugger
run-at-time 38.10 Timers for Delayed Execution
run-hook-with-args 22.1.1 Running Hooks
run-hook-with-args-until-failure 22.1.1 Running Hooks
run-hook-with-args-until-success 22.1.1 Running Hooks
run-hooks 22.1.1 Running Hooks
run-mode-hooks 22.2.6 Mode Hooks
run-with-idle-timer 38.11 Idle Timers

S
S-expression 9.1 Introduction to Evaluation
safe local variable 11.11 File Local Variables
safe, defcustom keyword 14.3 Defining Customization Variables
safe-length 5.3 Accessing Elements of Lists
safe-local-eval-forms 11.11 File Local Variables
safe-local-variable-p 11.11 File Local Variables
safe-local-variable-values 11.11 File Local Variables
safe-magic (property) 24.11 Making Certain File Names “Magic”
safely encode a string 32.10.3 Coding Systems in Lisp
safely encode characters in a charset 32.10.3 Coding Systems in Lisp
safely encode region 32.10.3 Coding Systems in Lisp
safety of functions 12.15 Determining whether a Function is Safe to Call
same-window-buffer-names 27.14 Additional Options for Displaying Buffers
same-window-p 27.14 Additional Options for Displaying Buffers
same-window-regexps 27.14 Additional Options for Displaying Buffers
save abbrevs in files 35.3 Saving Abbrevs in Files
save-abbrevs 35.3 Saving Abbrevs in Files
save-buffer 24.2 Saving Buffers
save-buffer-coding-system 32.10.2 Encoding and I/O
save-current-buffer 26.2 The Current Buffer
save-excursion 29.3 Excursions
save-match-data 33.6.4 Saving and Restoring the Match Data
save-restriction 29.4 Narrowing
save-selected-window 27.8 Selecting Windows
save-some-buffers 24.2 Saving Buffers
save-window-excursion 27.24 Window Configurations
SaveUnder feature 28.23 Display Feature Testing
saving buffers 24.2 Saving Buffers
saving text properties 24.12 File Format Conversion
saving window information 27.24 Window Configurations
scalability of overlays 37.9 Overlays
scalable fonts 37.12.9 Font Selection
scalable-fonts-allowed 37.12.9 Font Selection
scan-lists 34.6.1 Motion Commands Based on Parsing
scan-sexps 34.6.1 Motion Commands Based on Parsing
scanning expressions 34.6 Parsing Expressions
scanning for character sets 32.8 Scanning for Character Sets
scanning keymaps 21.16 Scanning Keymaps
scope 11.9 Scoping Rules for Variable Bindings
scoping rule 11.9 Scoping Rules for Variable Bindings
screen layout 2.4.7 Frame Configuration Type
screen lines, moving by 29.2.5 Motion by Screen Lines
screen of terminal 27.1 Basic Concepts of Emacs Windows
screen refresh 37.1 Refreshing the Screen
screen size 28.3.4 Frame Size And Position
screen-gamma, a frame parameter 28.3.3.8 Font and Color Parameters
script symbols 32.6 Character Properties
scroll bar events, data in 20.7.14 Accessing Scroll Bar Events
scroll bars 37.14 Scroll Bars
scroll-bar-background, a frame parameter 28.3.3.8 Font and Color Parameters
scroll-bar-event-ratio 20.7.14 Accessing Scroll Bar Events
scroll-bar-foreground, a frame parameter 28.3.3.8 Font and Color Parameters
scroll-bar-mode 37.14 Scroll Bars
scroll-bar-scale 20.7.14 Accessing Scroll Bar Events
scroll-bar-width 37.14 Scroll Bars
scroll-bar-width, a frame parameter 28.3.3.4 Layout Parameters
scroll-command property 27.20 Textual Scrolling
scroll-conservatively 27.20 Textual Scrolling
scroll-down 27.20 Textual Scrolling
scroll-down-aggressively 27.20 Textual Scrolling
scroll-down-command 27.20 Textual Scrolling
scroll-error-top-bottom 27.20 Textual Scrolling
scroll-left 27.22 Horizontal Scrolling
scroll-margin 27.20 Textual Scrolling
scroll-other-window 27.20 Textual Scrolling
scroll-preserve-screen-position 27.20 Textual Scrolling
scroll-right 27.22 Horizontal Scrolling
scroll-step 27.20 Textual Scrolling
scroll-up 27.20 Textual Scrolling
scroll-up-aggressively 27.20 Textual Scrolling
scroll-up-command 27.20 Textual Scrolling
scrolling textually 27.20 Textual Scrolling
search-backward 33.1 Searching for Strings
search-failed 33.1 Searching for Strings
search-forward 33.1 Searching for Strings
search-map 21.6 Prefix Keys
search-spaces-regexp 33.4 Regular Expression Searching
searching 33 Searching and Matching
searching active keymaps for keys 21.8 Searching the Active Keymaps
searching and case 33.2 Searching and Case
searching and replacing 33.7 Search and Replace
searching for overlays 37.9.3 Searching for Overlays
searching for regexp 33.4 Regular Expression Searching
searching text properties 31.19.3 Text Property Search Functions
secondary selection 28.18 Window System Selections
seconds-to-time 38.7 Parsing and Formatting Times
secure-hash 31.25 Checksum/Hash
select safe coding system 32.10.4 User-Chosen Coding Systems
select-frame 28.9 Input Focus
select-frame-set-input-focus 28.9 Input Focus
select-safe-coding-system 32.10.4 User-Chosen Coding Systems
select-safe-coding-system-accept-default-p 32.10.4 User-Chosen Coding Systems
select-window 27.8 Selecting Windows
selected window 27.1 Basic Concepts of Emacs Windows
selected-frame 28.9 Input Focus
selected-window 27.1 Basic Concepts of Emacs Windows
selecting a buffer 26.2 The Current Buffer
selecting a font 37.12.9 Font Selection
selecting a window 27.8 Selecting Windows
selection (for window systems) 28.18 Window System Selections
selection-coding-system 28.18 Window System Selections
selective-display 37.7 Selective Display
selective-display-ellipses 37.7 Selective Display
self-evaluating form 9.2.1 Self-Evaluating Forms
self-insert-and-exit 19.10 Minibuffer Commands
self-insert-command 31.5 User-Level Insertion Commands
self-insert-command override 21.12 Changing Key Bindings
self-insert-command, minor modes 22.3.2 Keymaps and Minor Modes
self-insertion 31.5 User-Level Insertion Commands
SELinux context 24.6.5 Extended File Attributes
send-string-to-terminal 38.13 Terminal Output
sending signals 36.8 Sending Signals to Processes
sentence-end 33.8 Standard Regular Expressions Used in Editing
sentence-end 33.8 Standard Regular Expressions Used in Editing
sentence-end-double-space 31.11 Filling
sentence-end-without-period 31.11 Filling
sentence-end-without-space 31.11 Filling
sentinel (of process) 36.10 Sentinels: Detecting Process Status Changes
sequence 6 Sequences, Arrays, and Vectors
sequence length 6.1 Sequences
sequencep 6.1 Sequences
sequencing 10.1 Sequencing
sequential execution 10.1 Sequencing
serial connections 36.19 Communicating with Serial Ports
serial-process-configure 36.19 Communicating with Serial Ports
serial-term 36.19 Communicating with Serial Ports
serializing 36.20 Packing and Unpacking Byte Arrays
session file 38.17 Session Management
session manager 38.17 Session Management
set 11.8 Setting Variable Values
set, defcustom keyword 14.3 Defining Customization Variables
set-advertised-calling-convention 12.11 Declaring Functions Obsolete
set-after, defcustom keyword 14.3 Defining Customization Variables
set-auto-coding 32.10.5 Default Coding Systems
set-auto-mode 22.2.2 How Emacs Chooses a Major Mode
set-buffer 26.2 The Current Buffer
set-buffer-auto-saved 25.2 Auto-Saving
set-buffer-major-mode 22.2.2 How Emacs Chooses a Major Mode
set-buffer-modified-p 26.5 Buffer Modification
set-buffer-multibyte 32.4 Selecting a Representation
set-case-syntax 4.9 The Case Table
set-case-syntax-delims 4.9 The Case Table
set-case-syntax-pair 4.9 The Case Table
set-case-table 4.9 The Case Table
set-category-table 34.8 Categories
set-char-table-extra-slot 6.6 Char-Tables
set-char-table-parent 6.6 Char-Tables
set-char-table-range 6.6 Char-Tables
set-charset-priority 32.7 Character Sets
set-coding-system-priority 32.10.6 Specifying a Coding System for One Operation
set-default 11.10.3 The Default Value of a Buffer-Local Variable
set-default-file-modes 24.7 Changing File Names and Attributes
set-display-table-slot 37.21.2 Display Tables
set-face-attribute 37.12.3 Face Attribute Functions
set-face-background 37.12.3 Face Attribute Functions
set-face-bold 37.12.3 Face Attribute Functions
set-face-font 37.12.3 Face Attribute Functions
set-face-foreground 37.12.3 Face Attribute Functions
set-face-inverse-video 37.12.3 Face Attribute Functions
set-face-italic 37.12.3 Face Attribute Functions
set-face-stipple 37.12.3 Face Attribute Functions
set-face-underline 37.12.3 Face Attribute Functions
set-file-acl 24.7 Changing File Names and Attributes
set-file-extended-attributes 24.7 Changing File Names and Attributes
set-file-modes 24.7 Changing File Names and Attributes
set-file-selinux-context 24.7 Changing File Names and Attributes
set-file-times 24.7 Changing File Names and Attributes
set-fontset-font 37.12.11 Fontsets
set-frame-configuration 28.12 Frame Configurations
set-frame-height 28.3.4 Frame Size And Position
set-frame-parameter 28.3.1 Access to Frame Parameters
set-frame-position 28.3.4 Frame Size And Position
set-frame-selected-window 27.8 Selecting Windows
set-frame-size 28.3.4 Frame Size And Position
set-frame-width 28.3.4 Frame Size And Position
set-fringe-bitmap-face 37.13.5 Customizing Fringe Bitmaps
set-input-method 32.11 Input Methods
set-input-mode 38.12.1 Input Modes
set-keyboard-coding-system 32.10.8 Terminal I/O Encoding
set-keymap-parent 21.5 Inheritance and Keymaps
set-left-margin 31.12 Margins for Filling
set-mark 30.7 The Mark
set-marker 30.6 Moving Marker Positions
set-marker-insertion-type 30.5 Marker Insertion Types
set-match-data 33.6.3 Accessing the Entire Match Data
set-minibuffer-window 19.11 Minibuffer Windows
set-mouse-pixel-position 28.14 Mouse Position
set-mouse-position 28.14 Mouse Position
set-network-process-option 36.17.2 Network Options
set-process-buffer 36.9.1 Process Buffers
set-process-coding-system 36.6 Process Information
set-process-datagram-address 36.16 Datagrams
set-process-filter 36.9.2 Process Filter Functions
set-process-plist 36.6 Process Information
set-process-query-on-exit-flag 36.11 Querying Before Exit
set-process-sentinel 36.10 Sentinels: Detecting Process Status Changes
set-register 31.21 Registers
set-right-margin 31.12 Margins for Filling
set-standard-case-table 4.9 The Case Table
set-syntax-table 34.3 Syntax Table Functions
set-terminal-coding-system 32.10.8 Terminal I/O Encoding
set-terminal-parameter 28.4 Terminal Parameters
set-text-properties 31.19.2 Changing Text Properties
set-transient-map 21.9 Controlling the Active Keymaps
set-visited-file-modtime 26.6 Buffer Modification Time
set-visited-file-name 26.4 Buffer File Name
set-window-buffer 27.10 Buffers and Windows
set-window-combination-limit 27.7 Recombining Windows
set-window-configuration 27.24 Window Configurations
set-window-dedicated-p 27.16 Dedicated Windows
set-window-display-table 37.21.3 Active Display Table
set-window-fringes 37.13.1 Fringe Size and Position
set-window-hscroll 27.22 Horizontal Scrolling
set-window-margins 37.16.5 Displaying in the Margins
set-window-next-buffers 27.15 Window History
set-window-parameter 27.25 Window Parameters
set-window-point 27.18 Windows and Point
set-window-prev-buffers 27.15 Window History
set-window-scroll-bars 37.14 Scroll Bars
set-window-start 27.19 The Window Start and End Positions
set-window-vscroll 27.21 Vertical Fractional Scrolling
setcar 5.6.1 Altering List Elements with setcar
setcdr 5.6.2 Altering the CDR of a List
setenv 38.3 Operating System Environment
setf 11.15.1 The setf Macro
setplist 8.4.1 Accessing Symbol Properties
setq 11.8 Setting Variable Values
setq-default 11.10.3 The Default Value of a Buffer-Local Variable
setq-local 11.10.2 Creating and Deleting Buffer-Local Bindings
sets 5.7 Using Lists as Sets
setting modes of files 24.7 Changing File Names and Attributes
setting-constant error 11.2 Variables that Never Change
severity level 37.5.1 Warning Basics
sexp 9.1 Introduction to Evaluation
sexp motion 29.2.6 Moving over Balanced Expressions
SHA hash 31.25 Checksum/Hash
shadowed Lisp files 15.3 Library Search
shadowing of variables 11.3 Local Variables
shared structure, read syntax 2.5 Read Syntax for Circular Objects
shell command arguments 36.2 Shell Arguments
shell-command-history 19.4 Minibuffer History
shell-command-to-string 36.3 Creating a Synchronous Process
shell-quote-argument 36.2 Shell Arguments
shift-selection, and interactive spec 20.2.1 Using interactive
shift-translation 20.8.1 Key Sequence Input
show image 37.17.9 Showing Images
show-help-function 31.19.4 Properties with Special Meanings
shr-insert-document 31.26 Parsing HTML and XML
shrink-window-if-larger-than-buffer 27.4 Resizing Windows
shy groups 33.3.1.3 Backslash Constructs in Regular Expressions
sibling window 27.2 Windows and Frames
side effect 9.1 Introduction to Evaluation
SIGHUP 38.2.1 Killing Emacs
SIGINT 38.2.1 Killing Emacs
signal 10.5.3.1 How to Signal an Error
signal-process 36.8 Sending Signals to Processes
signaling errors 10.5.3.1 How to Signal an Error
signals 36.8 Sending Signals to Processes
SIGTERM 38.2.1 Killing Emacs
SIGTSTP 38.2.2 Suspending Emacs
sigusr1 event 20.7.10 Miscellaneous System Events
sigusr2 event 20.7.10 Miscellaneous System Events
simple package 39.2 Simple Packages
sin 3.9 Standard Mathematical Functions
single file package 39.2 Simple Packages
single-function hook 22.1 Hooks
single-key-description 23.4 Describing Characters for Help Messages
sit-for 20.10 Waiting for Elapsed Time or Input
site-init.el E.1 Building Emacs
site-lisp directories 15.3 Library Search
site-load.el E.1 Building Emacs
site-run-file 38.1.2 The Init File
site-start.el 38.1.1 Summary: Sequence of Actions at Startup
size of frame 28.3.4 Frame Size And Position
size of image 37.17.9 Showing Images
size of text on display 37.10 Size of Displayed Text
size of window 27.3 Window Sizes
skip-chars-backward 29.2.7 Skipping Characters
skip-chars-forward 29.2.7 Skipping Characters
skip-syntax-backward 34.5 Motion and Syntax
skip-syntax-forward 34.5 Motion and Syntax
skipping characters 29.2.7 Skipping Characters
skipping characters of certain syntax 34.5 Motion and Syntax
skipping comments 34.6.5 Parameters to Control Parsing
sleep-for 20.10 Waiting for Elapsed Time or Input
slice, image 37.17.9 Showing Images
small-temporary-file-directory 24.8.5 Generating Unique File Names
smallest Lisp integer 3.1 Integer Basics
SMIE 22.7.1 Simple Minded Indentation Engine
SMIE grammar 22.7.1.3 Defining the Grammar of a Language
SMIE lexer 22.7.1.4 Defining Tokens
smie-bnf->prec2 22.7.1.2 Operator Precedence Grammars
smie-close-block 22.7.1.1 SMIE Setup and Features
smie-config 22.7.1.9 Customizing Indentation
smie-config-guess 22.7.1.9 Customizing Indentation
smie-config-local 22.7.1.9 Customizing Indentation
smie-config-save 22.7.1.9 Customizing Indentation
smie-config-set-indent 22.7.1.9 Customizing Indentation
smie-config-show-indent 22.7.1.9 Customizing Indentation
smie-down-list 22.7.1.1 SMIE Setup and Features
smie-merge-prec2s 22.7.1.2 Operator Precedence Grammars
smie-prec2->grammar 22.7.1.2 Operator Precedence Grammars
smie-precs->prec2 22.7.1.2 Operator Precedence Grammars
smie-rule-bolp 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-hanging-p 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-next-p 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-parent 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-parent-p 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-prev-p 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-separator 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-sibling-p 22.7.1.7 Helper Functions for Indentation Rules
smie-setup 22.7.1.1 SMIE Setup and Features
Snarf-documentation 23.2 Access to Documentation Strings
sort 5.6.3 Functions that Rearrange Lists
sort-columns 31.15 Sorting Text
sort-fields 31.15 Sorting Text
sort-fold-case 31.15 Sorting Text
sort-lines 31.15 Sorting Text
sort-numeric-base 31.15 Sorting Text
sort-numeric-fields 31.15 Sorting Text
sort-pages 31.15 Sorting Text
sort-paragraphs 31.15 Sorting Text
sort-regexp-fields 31.15 Sorting Text
sort-subr 31.15 Sorting Text
sorting lists 5.6.3 Functions that Rearrange Lists
sorting text 31.15 Sorting Text
sound 38.14 Sound Output
source breakpoints 17.2.6.3 Source Breakpoints
space (ASCII character) 2.3.3.1 Basic Char Syntax
space display spec, and bidirectional text 37.24 Bidirectional Display
spaces, pixel specification 37.16.3 Pixel Specification for Spaces
spaces, specified height or width 37.16.2 Specified Spaces
sparse keymap 21.3 Format of Keymaps
SPC in minibuffer 19.2 Reading Text Strings with the Minibuffer
special events 20.9 Special Events
special form descriptions 1.3.7.1 A Sample Function Description
special forms 9.2.7 Special Forms
special forms for control structures 10 Control Structures
special modes 22.2.1 Major Mode Conventions
special variables 11.9.4 Using Lexical Binding
special-event-map 21.9 Controlling the Active Keymaps
special-form-p 9.2.7 Special Forms
special-mode 22.2.5 Basic Major Modes
special-variable-p 11.9.4 Using Lexical Binding
specify coding system 32.10.6 Specifying a Coding System for One Operation
specify color 28.20 Color Names
speedups D.4 Tips for Making Compiled Code Fast
splicing (with backquote) 9.4 Backquote
split-height-threshold 27.14 Additional Options for Displaying Buffers
split-string 4.3 Creating Strings
split-string-and-unquote 36.2 Shell Arguments
split-string-default-separators 4.3 Creating Strings
split-width-threshold 27.14 Additional Options for Displaying Buffers
split-window 27.5 Splitting Windows
split-window-below 27.5 Splitting Windows
split-window-keep-point 27.5 Splitting Windows
split-window-preferred-function 27.14 Additional Options for Displaying Buffers
split-window-right 27.5 Splitting Windows
split-window-sensibly 27.14 Additional Options for Displaying Buffers
splitting windows 27.5 Splitting Windows
sqrt 3.9 Standard Mathematical Functions
stable sort 5.6.3 Functions that Rearrange Lists
standard abbrev tables 35.5 Standard Abbrev Tables
standard colors for character terminals 28.3.3.8 Font and Color Parameters
standard errors Appendix F Standard Errors
standard hooks Appendix H Standard Hooks
standard regexps used in editing 33.8 Standard Regular Expressions Used in Editing
standard syntax table 34.1 Syntax Table Concepts
standard-case-table 4.9 The Case Table
standard-category-table 34.8 Categories
standard-display-table 37.21.3 Active Display Table
standard-input 18.3 Input Functions
standard-output 18.6 Variables Affecting Output
standard-syntax-table 34.1 Syntax Table Concepts
standard-translation-table-for-decode 32.9 Translation of Characters
standard-translation-table-for-encode 32.9 Translation of Characters
standards of coding style Appendix D Tips and Conventions
start-file-process 36.4 Creating an Asynchronous Process
start-file-process-shell-command 36.4 Creating an Asynchronous Process
start-process 36.4 Creating an Asynchronous Process
start-process, command-line arguments from minibuffer 36.2 Shell Arguments
start-process-shell-command 36.4 Creating an Asynchronous Process
STARTTLS network connections 36.14 Network Connections
startup of Emacs 38.1.1 Summary: Sequence of Actions at Startup
startup screen 38.1.1 Summary: Sequence of Actions at Startup
startup.el 38.1.1 Summary: Sequence of Actions at Startup
staticpro, protection from GC E.6 Writing Emacs Primitives
sticky text properties 31.19.6 Stickiness of Text Properties
sticky, a frame parameter 28.3.3.6 Window Management Parameters
stop points 17.2.1 Using Edebug
stop-process 36.8 Sending Signals to Processes
stopbits, in serial connections 36.19 Communicating with Serial Ports
stopping an infinite loop 17.1.2 Debugging Infinite Loops
stopping on events 17.2.6.2 Global Break Condition
storage of vector-like Lisp objects E.3 Garbage Collection
store-match-data 33.6.3 Accessing the Entire Match Data
store-substring 4.4 Modifying Strings
stream (for printing) 18.4 Output Streams
stream (for reading) 18.2 Input Streams
strike-through text 37.12.1 Face Attributes
string 4.3 Creating Strings
string creation 4.3 Creating Strings
string equality 4.5 Comparison of Characters and Strings
string in keymap 21.10 Key Lookup
string input stream 18.2 Input Streams
string length 6.1 Sequences
string modification 4.4 Modifying Strings
string predicates 4.2 Predicates for Strings
string search 33.1 Searching for Strings
string to number 4.6 Conversion of Characters and Strings
string to object 18.3 Input Functions
string, number of bytes 32.1 Text Representations
string, writing a doc string 23.1 Documentation Basics
string-as-multibyte 32.4 Selecting a Representation
string-as-unibyte 32.4 Selecting a Representation
string-bytes 32.1 Text Representations
string-chars-consed E.4 Memory Usage
string-equal 4.5 Comparison of Characters and Strings
string-lessp 4.5 Comparison of Characters and Strings
string-match 33.4 Regular Expression Searching
string-match-p 33.4 Regular Expression Searching
string-or-null-p 4.2 Predicates for Strings
string-prefix-p 4.5 Comparison of Characters and Strings
string-suffix-p 4.5 Comparison of Characters and Strings
string-to-char 4.6 Conversion of Characters and Strings
string-to-int 4.6 Conversion of Characters and Strings
string-to-multibyte 32.3 Converting Text Representations
string-to-number 4.6 Conversion of Characters and Strings
string-to-syntax 34.7 Syntax Table Internals
string-to-unibyte 32.3 Converting Text Representations
string-width 37.10 Size of Displayed Text
string< 4.5 Comparison of Characters and Strings
string= 4.5 Comparison of Characters and Strings
stringp 4.2 Predicates for Strings
strings 4 Strings and Characters
strings with keyboard events 20.7.15 Putting Keyboard Events in Strings
strings, formatting them 4.7 Formatting Strings
strings-consed E.4 Memory Usage
submenu 21.17.2 Menus and the Mouse
subprocess 36 Processes
subr 12.1 What Is a Function?
subr-arity 12.1 What Is a Function?
subrp 12.1 What Is a Function?
subst-char-in-region 31.20 Substituting for a Character Code
substitute characters 31.20 Substituting for a Character Code
substitute-command-keys 23.3 Substituting Key Bindings in Documentation
substitute-in-file-name 24.8.4 Functions that Expand Filenames
substitute-key-definition 21.12 Changing Key Bindings
substituting keys in documentation 23.3 Substituting Key Bindings in Documentation
substring 4.3 Creating Strings
substring-no-properties 4.3 Creating Strings
subtype of char-table 6.6 Char-Tables
suggestions 1.1 Caveats
super characters 2.3.3.5 Other Character Modifier Bits
suppress-keymap 21.12 Changing Key Bindings
suspend (cf. no-redraw-on-reenter) 37.1 Refreshing the Screen
suspend evaluation 20.13 Recursive Editing
suspend-emacs 38.2.2 Suspending Emacs
suspend-frame 38.2.2 Suspending Emacs
suspend-hook 38.2.2 Suspending Emacs
suspend-resume-hook 38.2.2 Suspending Emacs
suspend-tty 38.2.2 Suspending Emacs
suspend-tty-functions 38.2.2 Suspending Emacs
suspending Emacs 38.2.2 Suspending Emacs
swap text between buffers 26.12 Swapping Text Between Two Buffers
switch-to-buffer 27.11 Switching to a Buffer in a Window
switch-to-buffer-other-frame 27.11 Switching to a Buffer in a Window
switch-to-buffer-other-window 27.11 Switching to a Buffer in a Window
switch-to-buffer-preserve-window-point 27.11 Switching to a Buffer in a Window
switch-to-next-buffer 27.15 Window History
switch-to-prev-buffer 27.15 Window History
switch-to-visible-buffer 27.15 Window History
switches on command line 38.1.4 Command-Line Arguments
switching to a buffer 27.11 Switching to a Buffer in a Window
sxhash 7.3 Defining Hash Comparisons
symbol 8 Symbols
symbol components 8.1 Symbol Components
symbol equality 8.3 Creating and Interning Symbols
symbol evaluation 9.2.2 Symbol Forms
symbol function indirection 9.2.4 Symbol Function Indirection
symbol in keymap 21.10 Key Lookup
symbol name hashing 8.3 Creating and Interning Symbols
symbol property 8.4 Symbol Properties
symbol that evaluates to itself 11.2 Variables that Never Change
symbol with constant value 11.2 Variables that Never Change
symbol, where defined 15.8 Which File Defined a Certain Symbol
symbol-file 15.8 Which File Defined a Certain Symbol
symbol-function 12.8 Accessing Function Cell Contents
symbol-name 8.3 Creating and Interning Symbols
symbol-plist 8.4.1 Accessing Symbol Properties
symbol-value 11.7 Accessing Variable Values
symbolp 8 Symbols
symbols-consed E.4 Memory Usage
synchronous subprocess 36.3 Creating a Synchronous Process
syntactic font lock 22.6.8 Syntactic Font Lock
syntax class 34.2 Syntax Descriptors
syntax class table 34.2.1 Table of Syntax Classes
syntax code 34.7 Syntax Table Internals
syntax descriptor 34.2 Syntax Descriptors
syntax entry, setting 34.3 Syntax Table Functions
syntax error (Edebug) 17.2.15.3 Backtracking in Specifications
syntax flags 34.2.2 Syntax Flags
syntax for characters 2.3.3.1 Basic Char Syntax
syntax of regular expressions 33.3.1 Syntax of Regular Expressions
syntax table 34 Syntax Tables
syntax table example 22.2.9 Major Mode Examples
syntax table internals 34.7 Syntax Table Internals
syntax tables in modes 22.2.1 Major Mode Conventions
syntax-after 34.7 Syntax Table Internals
syntax-begin-function 34.6.2 Finding the Parse State for a Position
syntax-class 34.7 Syntax Table Internals
syntax-ppss 34.6.2 Finding the Parse State for a Position
syntax-ppss-flush-cache 34.6.2 Finding the Parse State for a Position
syntax-ppss-toplevel-pos 34.6.3 Parser State
syntax-propertize-extend-region-functions 34.4 Syntax Properties
syntax-propertize-function 34.4 Syntax Properties
syntax-table 34.3 Syntax Table Functions
syntax-table (text property) 34.4 Syntax Properties
syntax-table-p 34.1 Syntax Table Concepts
system abbrev 35 Abbrevs and Abbrev Expansion
system processes 36.12 Accessing Other Processes
system type and name 38.3 Operating System Environment
system-configuration 38.3 Operating System Environment
system-groups 38.4 User Identification
system-key-alist 38.15 Operating on X11 Keysyms
system-messages-locale 32.12 Locales
system-name 38.3 Operating System Environment
system-time-locale 32.12 Locales
system-type 38.3 Operating System Environment
system-users 38.4 User Identification

T
t 1.3.2 nil and t
t input stream 18.2 Input Streams
t output stream 18.4 Output Streams
tab (ASCII character) 2.3.3.1 Basic Char Syntax
tab deletion 31.6 Deleting Text
TAB in minibuffer 19.2 Reading Text Strings with the Minibuffer
tab-always-indent 31.17.2 Indentation Controlled by Major Mode
tab-stop-list 31.17.5 Adjustable “Tab Stops”
tab-to-tab-stop 31.17.5 Adjustable “Tab Stops”
tab-width 37.21.1 Usual Display Conventions
tabs stops for indentation 31.17.5 Adjustable “Tab Stops”
Tabulated List mode 22.2.7 Tabulated List mode
tabulated-list-entries 22.2.7 Tabulated List mode
tabulated-list-format 22.2.7 Tabulated List mode
tabulated-list-init-header 22.2.7 Tabulated List mode
tabulated-list-mode 22.2.7 Tabulated List mode
tabulated-list-print 22.2.7 Tabulated List mode
tabulated-list-printer 22.2.7 Tabulated List mode
tabulated-list-revert-hook 22.2.7 Tabulated List mode
tabulated-list-sort-key 22.2.7 Tabulated List mode
tag on run time stack 10.5.1 Explicit Nonlocal Exits: catch and throw
tag, customization keyword 14.1 Common Item Keywords
tan 3.9 Standard Mathematical Functions
TCP 36.14 Network Connections
temacs E.1 Building Emacs
TEMP environment variable 24.8.5 Generating Unique File Names
temp-buffer-setup-hook 37.8 Temporary Displays
temp-buffer-show-function 37.8 Temporary Displays
temp-buffer-show-hook 37.8 Temporary Displays
temp-buffer-window-setup-hook 37.8 Temporary Displays
temp-buffer-window-show-hook 37.8 Temporary Displays
temporary buffer display 37.8 Temporary Displays
temporary display 37.8 Temporary Displays
temporary files 24.8.5 Generating Unique File Names
temporary-file-directory 24.8.5 Generating Unique File Names
TERM environment variable 38.1.3 Terminal-Specific Initialization
term-file-prefix 38.1.3 Terminal-Specific Initialization
Termcap 38.1.3 Terminal-Specific Initialization
terminal 28 Frames
terminal input 38.12 Terminal Input
terminal input modes 38.12.1 Input Modes
terminal output 38.13 Terminal Output
terminal parameters 28.4 Terminal Parameters
terminal screen 27.1 Basic Concepts of Emacs Windows
terminal type 2.4.5 Terminal Type
terminal-coding-system 32.10.8 Terminal I/O Encoding
terminal-list 28.2 Multiple Terminals
terminal-live-p 28 Frames
terminal-local variables 28.2 Multiple Terminals
terminal-name 28.2 Multiple Terminals
terminal-parameter 28.4 Terminal Parameters
terminal-parameters 28.4 Terminal Parameters
terminal-specific initialization 38.1.3 Terminal-Specific Initialization
termscript file 38.13 Terminal Output
terpri 18.5 Output Functions
test-completion 19.6.1 Basic Completion Functions
testcover-mark-all 17.4 Test Coverage
testcover-next-mark 17.4 Test Coverage
testcover-start 17.4 Test Coverage
testing types 2.6 Type Predicates
text 31 Text
text area of a window 27.3 Window Sizes
text comparison 4.5 Comparison of Characters and Strings
text conversion of coding system 32.10.3 Coding Systems in Lisp
text deletion 31.6 Deleting Text
text insertion 31.4 Inserting Text
text near point 31.1 Examining Text Near Point
text parsing 34 Syntax Tables
text properties 31.19 Text Properties
text properties in files 24.12 File Format Conversion
text properties in the mode line 22.4.6 Properties in the Mode Line
text properties, changing 31.19.2 Changing Text Properties
text properties, examining 31.19.1 Examining Text Properties
text properties, read syntax 2.3.8.4 Text Properties in Strings
text properties, searching 31.19.3 Text Property Search Functions
text representation 32.1 Text Representations
text terminal 28 Frames
text-char-description 23.4 Describing Characters for Help Messages
text-mode 22.2.5 Basic Major Modes
text-mode-abbrev-table 35.5 Standard Abbrev Tables
text-properties-at 31.19.1 Examining Text Properties
text-property-any 31.19.3 Text Property Search Functions
text-property-default-nonsticky 31.19.6 Stickiness of Text Properties
text-property-not-all 31.19.3 Text Property Search Functions
textual order 10 Control Structures
textual scrolling 27.20 Textual Scrolling
thing-at-point 31.2 Examining Buffer Contents
this-command 20.5 Information from the Command Loop
this-command-keys 20.5 Information from the Command Loop
this-command-keys-shift-translated 20.8.1 Key Sequence Input
this-command-keys-vector 20.5 Information from the Command Loop
this-original-command 20.5 Information from the Command Loop
three-step-help 23.5 Help Functions
throw 10.5.1 Explicit Nonlocal Exits: catch and throw
throw example 20.13 Recursive Editing
tiled windows 27.1 Basic Concepts of Emacs Windows
time calculations 38.9 Time Calculations
time conversion 38.6 Time Conversion
time formatting 38.7 Parsing and Formatting Times
time of day 38.5 Time of Day
time parsing 38.7 Parsing and Formatting Times
time zone, current 38.5 Time of Day
time-add 38.9 Time Calculations
time-less-p 38.9 Time Calculations
time-subtract 38.9 Time Calculations
time-to-day-in-year 38.9 Time Calculations
time-to-days 38.9 Time Calculations
timer 38.10 Timers for Delayed Execution
timer-max-repeats 38.10 Timers for Delayed Execution
timestamp of a mouse event 20.7.13 Accessing Mouse Events
timing programs 17.5 Profiling
tips for writing Lisp Appendix D Tips and Conventions
title, a frame parameter 28.3.3.1 Basic Parameters
TLS network connections 36.14 Network Connections
TMP environment variable 24.8.5 Generating Unique File Names
TMPDIR environment variable 24.8.5 Generating Unique File Names
toggle-enable-multibyte-characters 32.2 Disabling Multibyte Characters
tool bar 21.17.6 Tool bars
tool-bar-add-item 21.17.6 Tool bars
tool-bar-add-item-from-menu 21.17.6 Tool bars
tool-bar-border 21.17.6 Tool bars
tool-bar-button-margin 21.17.6 Tool bars
tool-bar-button-relief 21.17.6 Tool bars
tool-bar-lines frame parameter 28.3.3.4 Layout Parameters
tool-bar-local-item-from-menu 21.17.6 Tool bars
tool-bar-map 21.17.6 Tool bars
tool-bar-position frame parameter 28.3.3.4 Layout Parameters
tooltip 31.19.4 Properties with Special Meanings
top frame 28.11 Raising and Lowering Frames
top, a frame parameter 28.3.3.2 Position Parameters
top-level 20.13 Recursive Editing
top-level form 15 Loading
total height of a window 27.3 Window Sizes
total pixel height of a window 27.3 Window Sizes
total pixel height of a window 27.3 Window Sizes
total width of a window 27.3 Window Sizes
tq-close 36.13 Transaction Queues
tq-create 36.13 Transaction Queues
tq-enqueue 36.13 Transaction Queues
trace buffer 17.2.12 Trace Buffer
track-mouse 28.13 Mouse Tracking
trailing blanks in file names 24.6 Information about Files
transaction queue 36.13 Transaction Queues
transcendental functions 3.9 Standard Mathematical Functions
transient keymap 21.9 Controlling the Active Keymaps
transient-mark-mode 30.7 The Mark
translate-region 31.20 Substituting for a Character Code
translating input events 20.8.3 Modifying and Translating Input Events
translation keymap 21.14 Keymaps for Translating Sequences of Events
translation tables 32.9 Translation of Characters
translation-table-for-input 32.9 Translation of Characters
transparency, frame 28.3.3.8 Font and Color Parameters
transpose-regions 31.22 Transposition of Text
trash 24.7 Changing File Names and Attributes
trash 24.10 Creating, Copying and Deleting Directories
triple-click events 20.7.7 Repeat Events
true 1.3.2 nil and t
true list 5.1 Lists and Cons Cells
truename (of file) 24.6.3 Truenames
truncate 3.5 Numeric Conversions
truncate-lines 37.3 Truncation
truncate-partial-width-windows 37.3 Truncation
truncate-string-to-width 37.10 Size of Displayed Text
truth value 1.3.2 nil and t
try-completion 19.6.1 Basic Completion Functions
tty-color-alist 28.21 Text Terminal Colors
tty-color-approximate 28.21 Text Terminal Colors
tty-color-clear 28.21 Text Terminal Colors
tty-color-define 28.21 Text Terminal Colors
tty-color-mode, a frame parameter 28.3.3.8 Font and Color Parameters
tty-color-translate 28.21 Text Terminal Colors
tty-erase-char 38.3 Operating System Environment
tty-setup-hook 38.1.3 Terminal-Specific Initialization
tty-top-frame 28.11 Raising and Lowering Frames
turn multibyte support on or off 32.2 Disabling Multibyte Characters
two’s complement 3.1 Integer Basics
type 2 Lisp Data Types
type (button property) 37.18.1 Button Properties
type checking 2.6 Type Predicates
type checking internals E.6 Writing Emacs Primitives
type predicates 2.6 Type Predicates
type, defcustom keyword 14.4 Customization Types
type-of 2.6 Type Predicates
typographic conventions 1.3.1 Some Terms

U
UBA 37.24 Bidirectional Display
UDP 36.14 Network Connections
UID 38.4 User Identification
umask 24.7 Changing File Names and Attributes
unassigned character codepoints 32.6 Character Properties
unbalanced parentheses 17.3 Debugging Invalid Lisp Syntax
unbinding keys 21.15 Commands for Binding Keys
unbury-buffer 26.8 The Buffer List
undecided coding-system, when encoding 32.10.7 Explicit Encoding and Decoding
undefined 21.11 Functions for Key Lookup
undefined in keymap 21.10 Key Lookup
undefined key 21.2 Keymap Basics
underline-minimum-offset 37.12.1 Face Attributes
underlined text 37.12.1 Face Attributes
undo avoidance 31.20 Substituting for a Character Code
undo-ask-before-discard 31.10 Maintaining Undo Lists
undo-boundary 31.9 Undo
undo-in-progress 31.9 Undo
undo-limit 31.10 Maintaining Undo Lists
undo-outer-limit 31.10 Maintaining Undo Lists
undo-strong-limit 31.10 Maintaining Undo Lists
unexec E.1 Building Emacs
unhandled-file-name-directory 24.11 Making Certain File Names “Magic”
unibyte buffers, and bidi reordering 37.24 Bidirectional Display
unibyte text 32.1 Text Representations
unibyte-char-to-multibyte 32.3 Converting Text Representations
unibyte-string 32.1 Text Representations
Unicode 32.1 Text Representations
unicode bidirectional algorithm 37.24 Bidirectional Display
unicode character escape 2.3.3.2 General Escape Syntax
unicode general category 32.6 Character Properties
unicode, a charset 32.7 Character Sets
unicode-category-table 32.6 Character Properties
unintern 8.3 Creating and Interning Symbols
uninterned symbol 8.3 Creating and Interning Symbols
unique file names 24.8.5 Generating Unique File Names
universal-argument 20.12 Prefix Command Arguments
universal-argument-map Appendix G Standard Keymaps
unless 10.2 Conditionals
unload-feature 15.9 Unloading
unload-feature-special-hooks 15.9 Unloading
unloading packages 15.9 Unloading
unloading packages, preparing for D.1 Emacs Lisp Coding Conventions
unlock-buffer 24.5 File Locks
unnumbered group 33.3.1.3 Backslash Constructs in Regular Expressions
unpacking 36.20 Packing and Unpacking Byte Arrays
unread-command-events 20.8.6 Miscellaneous Event Input Features
unsafep 12.15 Determining whether a Function is Safe to Call
unsplittable, a frame parameter 28.3.3.5 Buffer Parameters
unused lexical variable 11.9.4 Using Lexical Binding
unwind-protect 10.5.4 Cleaning Up from Nonlocal Exits
unwinding 10.5.4 Cleaning Up from Nonlocal Exits
up-list 29.2.6 Moving over Balanced Expressions
upcase 4.8 Case Conversion in Lisp
upcase-initials 4.8 Case Conversion in Lisp
upcase-region 31.18 Case Changes
upcase-word 31.18 Case Changes
update-directory-autoloads 15.5 Autoload
update-file-autoloads 15.5 Autoload
upper case 4.8 Case Conversion in Lisp
upper case key sequence 20.8.1 Key Sequence Input
uptime of Emacs 38.8 Processor Run time
use-empty-active-region 30.8 The Region
use-global-map 21.9 Controlling the Active Keymaps
use-hard-newlines 31.11 Filling
use-local-map 21.9 Controlling the Active Keymaps
use-region-p 30.8 The Region
user errors, signaling 10.5.3.1 How to Signal an Error
user groups 38.4 User Identification
user identification 38.4 User Identification
user options, how to define 14.3 Defining Customization Variables
user signals 20.7.10 Miscellaneous System Events
user-defined error 10.5.3.4 Error Symbols and Condition Names
user-emacs-directory 38.1.2 The Init File
user-error 10.5.3.1 How to Signal an Error
user-full-name 38.4 User Identification
user-full-name 38.4 User Identification
user-init-file 38.1.2 The Init File
user-login-name 38.4 User Identification
user-login-name 38.4 User Identification
user-mail-address 38.4 User Identification
user-position, a frame parameter 28.3.3.2 Position Parameters
user-real-login-name 38.4 User Identification
user-real-login-name 38.4 User Identification
user-real-uid 38.4 User Identification
user-size, a frame parameter 28.3.3.3 Size Parameters
user-uid 38.4 User Identification
utf-8-emacs coding system 32.10.1 Basic Concepts of Coding Systems

V
valid windows 27.1 Basic Concepts of Emacs Windows
validity of coding system 32.10.3 Coding Systems in Lisp
value cell 8.1 Symbol Components
value of expression 9 Evaluation
value of function 12.1 What Is a Function?
values 9.5 Eval
variable 11 Variables
variable aliases 11.13 Variable Aliases
variable definition 11.5 Defining Global Variables
variable descriptions 1.3.7.2 A Sample Variable Description
variable limit error 11.3 Local Variables
variable with constant value 11.2 Variables that Never Change
variable, buffer-local 11.10 Buffer-Local Variables
variable-documentation property 23.1 Documentation Basics
variable-width spaces 37.16.2 Specified Spaces
variant coding system 32.10.1 Basic Concepts of Coding Systems
vc-mode 22.4.4 Variables Used in the Mode Line
vc-prefix-map 21.6 Prefix Keys
vconcat 6.5 Functions for Vectors
vector 6.5 Functions for Vectors
vector (type) 6.4 Vectors
vector evaluation 9.2.1 Self-Evaluating Forms
vector length 6.1 Sequences
vector-cells-consed E.4 Memory Usage
vector-like objects, storage E.3 Garbage Collection
vectorp 6.5 Functions for Vectors
verify-visited-file-modtime 26.6 Buffer Modification Time
version number (in file name) 24.8.1 File Name Components
version, customization keyword 14.1 Common Item Keywords
version-control 25.1.3 Making and Deleting Numbered Backup Files
vertical combination 27.2 Windows and Frames
vertical fractional scrolling 27.21 Vertical Fractional Scrolling
vertical scroll position 27.21 Vertical Fractional Scrolling
vertical tab 2.3.3.1 Basic Char Syntax
vertical-line prefix key 20.8.1 Key Sequence Input
vertical-motion 29.2.5 Motion by Screen Lines
vertical-scroll-bar 37.14 Scroll Bars
vertical-scroll-bar prefix key 20.8.1 Key Sequence Input
vertical-scroll-bars, a frame parameter 28.3.3.4 Layout Parameters
view part, model/view/controller 37.19 Abstract Display
view-register 31.21 Registers
virtual buffers 26.12 Swapping Text Between Two Buffers
visibility, a frame parameter 28.3.3.6 Window Management Parameters
visible frame 28.10 Visibility of Frames
visible-bell 37.22 Beeping
visible-frame-list 28.7 Finding All Frames
visited file 26.4 Buffer File Name
visited file mode 22.2.2 How Emacs Chooses a Major Mode
visited-file-modtime 26.6 Buffer Modification Time
visiting files 24.1 Visiting Files
visiting files, functions for 24.1.1 Functions for Visiting Files
visual order 37.24 Bidirectional Display
visual-order cursor motion 37.24 Bidirectional Display
void function 9.2.4 Symbol Function Indirection
void function cell 12.8 Accessing Function Cell Contents
void variable 11.4 When a Variable is “Void”
void-function 12.8 Accessing Function Cell Contents
void-text-area-pointer 28.17 Pointer Shape
void-variable error 11.4 When a Variable is “Void”

W
wait-for-wm, a frame parameter 28.3.3.6 Window Management Parameters
waiting 20.10 Waiting for Elapsed Time or Input
waiting for command key input 20.8.6 Miscellaneous Event Input Features
waiting-for-user-input-p 36.10 Sentinels: Detecting Process Status Changes
walk-windows 27.9 Cyclic Ordering of Windows
warn 37.5.1 Warning Basics
warning options 37.5.3 Warning Options
warning type 37.5.1 Warning Basics
warning variables 37.5.2 Warning Variables
warning-fill-prefix 37.5.2 Warning Variables
warning-levels 37.5.2 Warning Variables
warning-minimum-level 37.5.3 Warning Options
warning-minimum-log-level 37.5.3 Warning Options
warning-prefix-function 37.5.2 Warning Variables
warning-series 37.5.2 Warning Variables
warning-suppress-log-types 37.5.3 Warning Options
warning-suppress-types 37.5.3 Warning Options
warning-type-format 37.5.2 Warning Variables
warnings 37.5 Reporting Warnings
watch, for filesystem events 38.19 Notifications on File Changes
wheel-down event 20.7.10 Miscellaneous System Events
wheel-up event 20.7.10 Miscellaneous System Events
when 10.2 Conditionals
where was a symbol defined 15.8 Which File Defined a Certain Symbol
where-is-internal 21.16 Scanning Keymaps
while 10.4 Iteration
while-no-input 20.8.6 Miscellaneous Event Input Features
whitespace 2.3.3.1 Basic Char Syntax
wholenump 3.3 Type Predicates for Numbers
widen 29.4 Narrowing
widening 29.4 Narrowing
width of a window 27.3 Window Sizes
width, a frame parameter 28.3.3.3 Size Parameters
window 27.1 Basic Concepts of Emacs Windows
window (overlay property) 37.9.2 Overlay Properties
window body 27.3 Window Sizes
window body height 27.3 Window Sizes
window body size 27.3 Window Sizes
window body width 27.3 Window Sizes
window combination 27.2 Windows and Frames
window combination limit 27.7 Recombining Windows
window configuration (Edebug) 17.2.14.2 Edebug Display Update
window configurations 27.24 Window Configurations
window dividers 37.15 Window Dividers
window end position 27.19 The Window Start and End Positions
window excursions 29.3 Excursions
window header line 22.4.7 Window Header Lines
window height 27.3 Window Sizes
window history 27.15 Window History
window in direction 27.2 Windows and Frames
window internals E.7.2 Window Internals
window layout in a frame 2.4.6 Window Configuration Type
window layout, all frames 2.4.7 Frame Configuration Type
window manager interaction, and frame parameters 28.3.3.6 Window Management Parameters
window ordering, cyclic 27.9 Cyclic Ordering of Windows
window parameters 27.25 Window Parameters
window pixel height 27.3 Window Sizes
window pixel height 27.3 Window Sizes
window point 27.18 Windows and Point
window point internals E.7.2 Window Internals
window position 27.18 Windows and Point
window position 27.23 Coordinates and Windows
window position on display 28.3.3.2 Position Parameters
window positions and window managers 28.3.3.2 Position Parameters
window resizing 27.4 Resizing Windows
window selected within a frame 27.1 Basic Concepts of Emacs Windows
window size 27.3 Window Sizes
window size on display 28.3.3.3 Size Parameters
window size, changing 27.4 Resizing Windows
window splitting 27.5 Splitting Windows
window start position 27.19 The Window Start and End Positions
window state 27.24 Window Configurations
window that satisfies a predicate 27.9 Cyclic Ordering of Windows
window top line 27.19 The Window Start and End Positions
window tree 27.2 Windows and Frames
window width 27.3 Window Sizes
window-absolute-pixel-edges 27.23 Coordinates and Windows
window-at 27.23 Coordinates and Windows
window-body-height 27.3 Window Sizes
window-body-size 27.3 Window Sizes
window-body-width 27.3 Window Sizes
window-bottom-divider-width 37.15 Window Dividers
window-buffer 27.10 Buffers and Windows
window-child 27.2 Windows and Frames
window-combination-limit 27.7 Recombining Windows
window-combination-limit 27.7 Recombining Windows
window-combination-resize 27.7 Recombining Windows
window-combined-p 27.2 Windows and Frames
window-configuration-change-hook 27.26 Hooks for Window Scrolling and Changes
window-configuration-frame 27.24 Window Configurations
window-configuration-p 27.24 Window Configurations
window-current-scroll-bars 37.14 Scroll Bars
window-dedicated-p 27.16 Dedicated Windows
window-display-table 37.21.3 Active Display Table
window-edges 27.23 Coordinates and Windows
window-end 27.19 The Window Start and End Positions
window-frame 27.2 Windows and Frames
window-fringes 37.13.1 Fringe Size and Position
window-full-height-p 27.3 Window Sizes
window-full-width-p 27.3 Window Sizes
window-header-line-height 22.4.7 Window Header Lines
window-header-line-height 27.3 Window Sizes
window-hscroll 27.22 Horizontal Scrolling
window-id, a frame parameter 28.3.3.6 Window Management Parameters
window-in-direction 27.2 Windows and Frames
window-inside-absolute-pixel-edges 27.23 Coordinates and Windows
window-inside-edges 27.23 Coordinates and Windows
window-inside-pixel-edges 27.23 Coordinates and Windows
window-left-child 27.2 Windows and Frames
window-left-column 27.23 Coordinates and Windows
window-line-height 27.19 The Window Start and End Positions
window-list 27.2 Windows and Frames
window-live-p 27.1 Basic Concepts of Emacs Windows
window-margins 37.16.5 Displaying in the Margins
window-min-height 27.3 Window Sizes
window-min-height 27.3 Window Sizes
window-min-size 27.3 Window Sizes
window-min-width 27.3 Window Sizes
window-min-width 27.3 Window Sizes
window-minibuffer-p 19.11 Minibuffer Windows
window-mode-line-height 27.3 Window Sizes
window-next-buffers 27.15 Window History
window-next-sibling 27.2 Windows and Frames
window-parameter 27.25 Window Parameters
window-parameters 27.25 Window Parameters
window-parent 27.2 Windows and Frames
window-persistent-parameters 27.25 Window Parameters
window-pixel-edges 27.23 Coordinates and Windows
window-pixel-height 27.3 Window Sizes
window-pixel-left 27.23 Coordinates and Windows
window-pixel-top 27.23 Coordinates and Windows
window-pixel-width 27.3 Window Sizes
window-point 27.18 Windows and Point
window-point-insertion-type 27.18 Windows and Point
window-prev-buffers 27.15 Window History
window-prev-sibling 27.2 Windows and Frames
window-resizable 27.4 Resizing Windows
window-resize 27.4 Resizing Windows
window-resize-pixelwise 27.4 Resizing Windows
window-right-divider-width 37.15 Window Dividers
window-scroll-bar-width 37.14 Scroll Bars
window-scroll-bars 37.14 Scroll Bars
window-scroll-functions 27.26 Hooks for Window Scrolling and Changes
window-setup-hook 38.1.2 The Init File
window-size-change-functions 27.26 Hooks for Window Scrolling and Changes
window-size-fixed 27.3 Window Sizes
window-start 27.19 The Window Start and End Positions
window-state-get 27.24 Window Configurations
window-state-put 27.24 Window Configurations
window-system 37.23 Window Systems
window-system 37.23 Window Systems
window-system-initialization-alist 38.1.1 Summary: Sequence of Actions at Startup
window-text-change-functions Appendix H Standard Hooks
window-text-pixel-size 37.10 Size of Displayed Text
window-top-child 27.2 Windows and Frames
window-top-line 27.23 Coordinates and Windows
window-total-height 27.3 Window Sizes
window-total-size 27.3 Window Sizes
window-total-width 27.3 Window Sizes
window-tree 27.2 Windows and Frames
window-valid-p 27.1 Basic Concepts of Emacs Windows
window-vscroll 27.21 Vertical Fractional Scrolling
windowp 27.1 Basic Concepts of Emacs Windows
windows, controlling precisely 27.10 Buffers and Windows
windows, recombining 27.7 Recombining Windows
with-case-table 4.9 The Case Table
with-coding-priority 32.10.6 Specifying a Coding System for One Operation
with-current-buffer 26.2 The Current Buffer
with-current-buffer-window 37.8 Temporary Displays
with-demoted-errors 10.5.3.3 Writing Code to Handle Errors
with-eval-after-load 15.10 Hooks for Loading
with-help-window 23.5 Help Functions
with-local-quit 20.11 Quitting
with-no-warnings 16.6 Compiler Errors
with-output-to-string 18.5 Output Functions
with-output-to-temp-buffer 37.8 Temporary Displays
with-selected-window 27.8 Selecting Windows
with-syntax-table 34.3 Syntax Table Functions
with-temp-buffer 26.2 The Current Buffer
with-temp-buffer-window 37.8 Temporary Displays
with-temp-file 24.4 Writing to Files
with-temp-message 37.4.1 Displaying Messages in the Echo Area
with-timeout 38.10 Timers for Delayed Execution
word-search-backward 33.1 Searching for Strings
word-search-backward-lax 33.1 Searching for Strings
word-search-forward 33.1 Searching for Strings
word-search-forward-lax 33.1 Searching for Strings
word-search-regexp 33.1 Searching for Strings
words in region 29.2.4 Motion by Text Lines
words-include-escapes 29.2.2 Motion by Words
wrap-prefix 37.3 Truncation
write-abbrev-file 35.3 Saving Abbrevs in Files
write-char 18.5 Output Functions
write-contents-functions 24.2 Saving Buffers
write-file 24.2 Saving Buffers
write-file-functions 24.2 Saving Buffers
write-region 24.4 Writing to Files
write-region-annotate-functions 24.12.3 Piecemeal Specification
write-region-post-annotation-function 24.12.3 Piecemeal Specification
writing a documentation string 23.1 Documentation Basics
writing Emacs primitives E.6 Writing Emacs Primitives
writing to files 24.4 Writing to Files
wrong-number-of-arguments 12.2.3 Other Features of Argument Lists
wrong-type-argument 2.6 Type Predicates

X
X display names 28.2 Multiple Terminals
X Window System 37.23 Window Systems
x-alt-keysym 38.15 Operating on X11 Keysyms
x-alternatives-map Appendix G Standard Keymaps
x-bitmap-file-path 37.12.1 Face Attributes
x-close-connection 28.2 Multiple Terminals
x-color-defined-p 28.20 Color Names
x-color-values 28.20 Color Names
x-defined-colors 28.20 Color Names
x-display-color-p 28.23 Display Feature Testing
x-display-list 28.2 Multiple Terminals
x-dnd-known-types 28.19 Drag and Drop
x-dnd-test-function 28.19 Drag and Drop
x-dnd-types-alist 28.19 Drag and Drop
x-family-fonts 37.12.10 Looking Up Fonts
x-get-resource 28.22 X Resources
x-get-selection 28.18 Window System Selections
x-hyper-keysym 38.15 Operating on X11 Keysyms
x-list-fonts 37.12.10 Looking Up Fonts
x-meta-keysym 38.15 Operating on X11 Keysyms
x-open-connection 28.2 Multiple Terminals
x-parse-geometry 28.3.5 Geometry
x-pointer-shape 28.17 Pointer Shape
x-popup-dialog 28.16 Dialog Boxes
x-popup-menu 28.15 Pop-Up Menus
x-resource-class 28.22 X Resources
x-resource-name 28.22 X Resources
x-sensitive-text-pointer-shape 28.17 Pointer Shape
x-server-vendor 28.23 Display Feature Testing
x-server-version 28.23 Display Feature Testing
x-set-selection 28.18 Window System Selections
x-setup-function-keys Appendix G Standard Keymaps
x-super-keysym 38.15 Operating on X11 Keysyms
X11 keysyms 38.15 Operating on X11 Keysyms
XBM 37.17.3 XBM Images
XPM 37.17.4 XPM Images

Y
y-or-n-p 19.7 Yes-or-No Queries
y-or-n-p-with-timeout 19.7 Yes-or-No Queries
yank 31.8.4 Functions for Yanking
yank suppression 21.12 Changing Key Bindings
yank-excluded-properties 31.8.3 Yanking
yank-handled-properties 31.8.3 Yanking
yank-pop 31.8.4 Functions for Yanking
yank-undo-function 31.8.4 Functions for Yanking
yanking and text properties 31.8.3 Yanking
yes-or-no questions 19.7 Yes-or-No Queries
yes-or-no-p 19.7 Yes-or-No Queries

Z
zerop 3.3 Type Predicates for Numbers
zlib-available-p 31.23 Dealing With Compressed Data
zlib-decompress-region 31.23 Dealing With Compressed Data

Jump to:   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   1   2   3   ;   <   =   >   ?   @   [   \   ]   ^   `   |  
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z  

[Top] [Contents] [Index] [ ? ]

Footnotes

(1)

“サブ文字テーブル(sub-char-tables)”に使用される‘#^^’を目にすることがあるかもしれません。

(2)

リストの最後に要素を追加するための、これと完全に同等な方法はありません。listnameをコピーすることにより、新しいリストを作成してから、neweltをそのリストの最後に追加する、(append listname (list newelt))を使用することができます。すべてのCDRを辿って、終端のnilを置き換える、(nconc listname (list newelt))を使用することもできます。コピーも変更も行なわずに、リストの先頭に要素を追加するconsと比較してみてください。

(3)

ここでの“キー(key)”の使い方は、用語“キーシーケンス(key sequence)”とは関係ありません。キーはテーブルにあるアイテムを探すために使用される値という意味です。この場合、テーブルはalistでありalistはアイテムに関連付けられます。

(4)

S式(S-expression)、短くはsexpという言葉でも呼ばれることがありますが、わたしたちは通常、このマニュアル内ではこの用語は使用しません。

(5)

“環境”にたいするこの定義は、プログラムの結果に影響し得るすべてのデータを特に意図するものではありません。

(6)

正確に言うと、デフォルトのダイナミックスコープ(dynamic scoping)のルールでは、値セルは常にその変数のカレント値を保持しますが、レキシカルスコープ(lexical scoping)では異なります。詳細は、Scoping Rules for Variable Bindingsを参照してください。

(7)

これには、いくつか例外があります。たとえば、レキシカルバインディングは、Lispデバッガーからもアクセスできます。

(8)

MS-DOS版のEmacsは、DOSファイルシステムの制限により、かわりに_dir-locals.elという名前を使用します。

(9)

これはカリー化(currying)と関連しますが、異なる機能です。カーリングは、複数の引数をとる関数を、関数チェーンとして呼び出せるような、1つの引数を取る個々の関数に変換するような方法です。

(10)

Some elements actually supply two arguments.

(11)

Button-down is the conservative antithesis of drag.

(12)

It is required for menus which do not use a toolkit, e.g., on a text terminal.

(13)

In MS-Windows versions of Emacs compiled for the Cygwin environment, you can use the functions cygwin-convert-file-name-to-windows and cygwin-convert-file-name-from-windows to convert between the two file-name syntaxes.

(14)

An RFC, an acronym for Request for Comments, is a numbered Internet informational document describing a standard. RFCs are usually written by technical experts acting on their own initiative, and are traditionally written in a pragmatic, experience-driven manner.

(15)

This internal representation is based on one of the encodings defined by the Unicode Standard, called UTF-8, for representing any Unicode codepoint, but Emacs extends UTF-8 to represent the additional codepoints it uses for raw 8-bit bytes and characters not unified with Unicode.

(16)

The Unicode specification writes these tag names inside ‘<..>’ brackets, but the tag names in Emacs do not include the brackets; e.g., Unicode specifies ‘<small>’ where Emacs uses ‘small’.

(17)

Note that regexp-opt does not guarantee that its result is absolutely the most efficient form possible. A hand-tuned regular expression can sometimes be slightly more efficient, but is almost never worth the effort.

(18)

On other systems, Emacs uses a Lisp emulation of ls; see Contents of Directories.

(19)

For backward compatibility, you can also use a string to specify a face name; that is equivalent to a Lisp symbol with the same name.

(20)

In this context, the term font has nothing to do with Font Lock (see section Font Lock Mode).

(21)

The benefits of a Common Lisp-style package system are considered not to outweigh the costs.


[Top] [Contents] [Index] [ ? ]

Table of Contents


[Top] [Contents] [Index] [ ? ]

Short Table of Contents


[Top] [Contents] [Index] [ ? ]

About This Document

This document was generated on January 16, 2018 using texi2any.

The buttons in the navigation panels have the following meaning:

Button Name Go to From 1.2.3 go to
[ << ] FastBack Beginning of this chapter or previous chapter 1
[ < ] Back Previous section in reading order 1.2.2
[ Up ] Up Up section 1.2
[ > ] Forward Next section in reading order 1.2.4
[ >> ] FastForward Next chapter 2
[Top] Top Cover (top) of document  
[Contents] Contents Table of contents  
[Index] Index Index  
[ ? ] About About (help)  

where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure:


This document was generated on January 16, 2018 using texi2any.